slevin87
Goto Top

Powershell Zähler Frage

Hallo miteinander,

ich habe eine Frage zum Zähler bei Powershell.

Ist es möglich beim ausführen eines Spriptes, einen Zähler bei 00001 starten zu lassen und erst am nächstes Tag zu resetten?

Zweck soll es sein, gescannte Dokumente im PDF Format, beim speichern einen Zähler im Namen mitzugeben. Dieser soll aber erst am nächsten Tag wieder mit 00001 beginnen.

Vielen Dank im voraus.

Gruß

Content-Key: 667461

Url: https://administrator.de/contentid/667461

Printed on: April 20, 2024 at 02:04 o'clock

Member: SeaStorm
SeaStorm Jun 09, 2021 at 20:33:43 (UTC)
Goto Top
Hi

klar geht das.
Es kommt es halt auf das Script an. Läuft das in einer Endlosschleife? Oder Rufst du das periodisch auf?
Irgendwie musst du dir ja die aktuelle Zahl merken. Und da kannst du dann ja um x Uhr einfach diese Variable auf 1 setzen.
Wenn du dir die Zahl z.B in einer Datei oÄ speicherst, dann kannst du einfach per Job um x Uhr diese Datei verändern.
Member: Tezzla
Tezzla Jun 09, 2021 at 20:56:09 (UTC)
Goto Top
Oder du liest das Erstell-Datum aus der letzten PDF aus, vergleichst es mit dem aktuellen Datum und zählst weiter oder wieder ab 1.

Da muss dann nix gespeichert werden.

VG
Member: Cloudrakete
Cloudrakete Jun 10, 2021 at 13:39:48 (UTC)
Goto Top
Ich verstehe ehrlich gesagt deinen Lösungsansatz im allgemeinen nicht ganz.
Also Scannen macht ja der Drucker ... warum speichert also nicht auch der Drucker das File und gebt den Namen mit? Das kann jeder etwas bessere Enterprise Drucker mit einer vernünftigen Verwaltungsoberfläche.
In der Regel können die sogar hochzählen face-smile

Dann kannst du nämlich den ganzen PowerShell-Kram einfach weglassen, weil egal wie man das baut ... es wird die reinste Bastelrei.
Ich denke mal das PowerShell wird nicht durchgehend laufen, sondern wird immer (wenn gebraucht) gestartet ... Ergo: Du musst den Counter aus der jeweiligen Laufzeit rausholen und von extern befüllen.


Mal ein ganz grober Abriss ... Ich würde dafür einfach kein PowerShell benutzen, wenn nicht zwingend notwendig
Member: Slevin87
Slevin87 Jun 10, 2021 at 16:55:14 (UTC)
Goto Top
Hallo,

erst einmal vielen Dank für eure Antworten.

Ich werde das Projekt vorerst auf Eis legen.
Ich fange gerade erst an mit Powershell und hab noch einiges an Grundlagen zu lernen.

@Cloudrakete
Ich würde das Script gerne für die Arbeit nutzen. Das Scannerprogramm unterstützt auch einen Zähler, dieser wird jedoch jedesmal zurückgesetzt, sobald ein neuer Job gestartet wird.
Es besteht jedoch die Möglichkeit im Scan-Profil Powershell Scripte zu implementieren.
Daher mein Ansatz...

Gruß
Member: colinardo
colinardo Jun 11, 2021 updated at 09:28:52 (UTC)
Goto Top
Servus @Slevin87, willkommen auf Administrator.de!
Mal zwei einfache Ansätze für deinen Powershell Lernfortschritt (Das Umbenennen von Dateien habe ich hier mal weggelassen, und das ganze nur auf den Counter beschränkt, denn das Umbenennen sollte ja kein Problem darstellen). Weitere Kommentare zu den Zeilen s. Code.

Counter anhand von vorhandenen Dateien in einem Ordner erhöhen, bei denen die Zähler am Ende des Basename der Dateien stehen
# Ordner mit Dateien
$folder = 'D:\data'  
# counter anhand der letzten vergebenen Nummer aus den Dateien ermitteln (Hiesige Voraussetzung im Beispiel: Nummern stehen im Dateinamen am Ende des Basename)
$cnt = "{0:D5}" -f ((ls $folder -File -Filter *.pdf | ?{$_.CreationTime.Date -eq (get-date).Date -and $_.Basename -match '\d+$'} | sort {[int]$matches} -Descending | select -F 1 | %{[int]$matches}) + 1)  
# counter ausgeben
$cnt

Variante 2 mit der Speicherung des Zählers in einer Log-Datei
# counter file
$statefile = 'D:\data\state.log'  
# wenn counter file existiert
if (Test-Path $statefile){
    # Daten aus erster Zeile auslesen und anhand des Doppelpunktes in ein Array speichern $state enthält Datum-Ticks des Tages um 00:00, $state[1] die aktuelle Nummer
    $state = (gc $statefile -Head 1).split(':')  
    # Nummer um eins erhöhen 
    $state[1] = [int]$state[1]+1
    # Wenn das Datum aus der Datei 00:00 Uhr kleiner ist das das aktuell ermittelte setze den Zähler und das Datum zurück
    if (([datetime]([int64]$state)) -lt (get-date).Date){
        $state = (get-date).Date.Ticks
        $state[1] = 1
    }
}else{
    # es gibt kein Logfile starte mit Anfangswerten
    $state = (get-date).Date.Ticks,1
}
# counter formatieren
$cnt = "{0:D5}" -f ([int]$state[1])  
# counter ausgeben oder sonst was damit machen
$cnt
# neuen Status in counterfile zurückschreiben
$state -join ':' | sc $statefile  
Wo du den Zähler speicherst kannst du natürlich variieren, ob nun als einfache Textdatei wie oben oder als XML oder CSV, das bleibt dir dann überlassen.

Viel Erfolg bei deinem Lernfortschritt.

Grüße Uwe
Member: TK1987
TK1987 Jun 11, 2021 updated at 13:37:20 (UTC)
Goto Top
Moin,

Variante 3: Speicherung von Zähler und Datum als Umgebungsvariable:
# Datum von Heute als Zeichenkette
$Date = Get-Date -Format 'dd.MM.yyyy'  

# Wenn Counter nicht von Heute ist (oder nicht existiert)
if ( "$Env:ScanCounter".Split(';')[1] -ne $Date ) {  
  # Setze Counter auf 1
  $Counter = 1
}
else  {
  # Counter in Typ Integer umwandeln
  [int]$Counter = $Env:ScanCounter.Split(';')  

  # Counter um 1 erhöhen
  $Counter++
}

# aktuellen Counter und Datum als Umgebungsvariable für aktuellen Benutzer speichern
[Environment]::SetEnvironmentVariable( 'ScanCounter' , "$Counter;$Date" , "User" )  

# Mache etwas mit dem aktuellen $Counter

Gruß Thomas
Member: Slevin87
Slevin87 Jun 13, 2021 updated at 18:32:44 (UTC)
Goto Top
Hallo Leute,

ihr seid der Wahnsinn, vielen Dank für die Scripte!

Ich werde mich auf jeden Fall mit der Thematik weiterbeschäftigen.

Es ist super interessant was mit Powershell alles möglich ist.

Schönen Abend an alle

Gruß