forseti2003
Goto Top

Dateien verarbeiten mit PowerShell

Hallo in die Runde,

ich bastel gerade hier an einem PowerShell-Skript, die Anforderungen sind überschaubar:

1) Lies aus dem Verzeichnis1 Dateien aus und geben deren Inhalt (sortiert nach Erstelldatum) in eine Datei.tmp in Verzeichnis 2, sofern vorhanden oder erstelle diese und befülle sie.
Die ausgelesene Datei dann in ein Unterverzeichnis schieben.

2) Prüfe in Verzeichnis 3 ob eine Datei.dat vorhanden ist, wenn ja, mach mit Aufgabe 1 weiter, oder verschiebe die Datei.tmp von Verzeichnis2 zu Verzeichnis3 und benennen sie um auf tmp

Bin derzeit ein wenig ratlos und noch recht neu mit PowerShell-Skripten, wäre für ein paar kleine Tipps oder Hinweise dankbar.
Das hab ich bisher:

# Prüft ob Dateien im Verzeichnis 1 vorhanden sind und überträgt den Inhalt in eine neue Datei
$backup = "e:\labor\verz1\OK"  
$verz1 = "E:\labor\verz1"  
$verz2 = "E:\labor\verz2"  
$verz3 = "E:\labor\verz3"  

if(Test-Path $verz1\*.txt){

foreach ($i in Get-Childitem -Path $verz1 | Sort-Object -Property Fullname){

    Get-Content -Path $i.Fullname >> $verz2\test.tmp    
    Move-Item -Path $i.Fullname -Destination $backup -Force
        
}}
else {
    echo "keine Datei vorhanden"  
}


# Prüft ob eine Datei in Verzeichnis 3 vorhanden ist, wenn nicht verschiebt er die Datei aus Verzeichnis 2
if(Test-Path $verz3\test.dat){
        echo "Status: nichts zu tun"  
}
else {
        Move-Item -Path $verz2\test.tmp -Destination $verz3\test.dat
}

Eventuell kann man den Code ja noch eleganter gestalten, auch wäre es nicht übel, wenn er im Teil 1 beim Foreach maximal 20 Dateien bearbeitet und dann erstmal auf Teil 2 prüft bevor er weitermacht. Dazu hab ich aber derzeit keine Idee, wie das gehen könnte.

Content-Key: 389593

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

Ausgedruckt am: 29.03.2024 um 11:03 Uhr

Mitglied: erikro
Lösung erikro 16.10.2018 um 16:15:55 Uhr
Goto Top
Moin,

 # Prüft ob Dateien im Verzeichnis 1 vorhanden sind und überträgt den Inhalt in eine neue Datei

PARAM (
# Das macht die Sache etwas flexibler, da Du so beim Aufruf des Skripts auch andere Verzeichnisse angeben kannst.
# Das ist aber reine Kosmetik. ;)

$backup = "e:\labor\verz1\OK",  
$verz1 = "E:\labor\verz1",  
$verz2 = "E:\labor\verz2",  
$verz3 = "E:\labor\verz3",  
$counter = 0

)

function move-testdat {

# Prüft ob eine Datei in Verzeichnis 3 vorhanden ist, wenn nicht verschiebt er die Datei aus Verzeichnis 2
 if(Test-Path $verz3\test.dat){
         echo "Status: nichts zu tun"  
 }
 else {
         Move-Item -Path $verz2\test.tmp -Destination $verz3\test.dat
 }

}
 
 if(Test-Path $verz1\*.txt){
     
#   Get-Content -Path $verz1\*.txt >> $verz2\TEST.tmp | ForEach-Object -process {move-item -Destination $backup}
#   So wird das nichts.
             # Auslesen der Dateiobjekte aus dem Verzeichnis in ein Array.
             $files = get-childitem $verz1\*.txt

             # Behandlung jedes einzelnen Objekts des Arrays
             foreach($file in $files) {

                            get-content -path $file.Fullname | out-file $verz2\TEST.tmp -append -encoding utf8

                           # Ich würde immer out-file bevorzugen, da ich hier z. B. angeben kann, 
                           # wie die Daten kodiert werden sollen.
                           # In der Eigenschaft FullName steht der komplette Pfad auf die Datei.

                           move-item -path $file.Fullname -destination $backup
                         
                          # Damit es schick wird und nach 20 Durchläufen der Test stattfindet
                          if ($counter -eq 20) {

                                               move-testdat
                                               # Soll die Prüfung nach jedem 20ten Durchlauf erfolgen,
                                               # dann die nächste Raute entfernen.
                                               # $counter = 0

                          }
                          $counter++

            }

 }
 

 


hth

Erik
Mitglied: Forseti2003
Forseti2003 16.10.2018 um 18:07:32 Uhr
Goto Top
Hi erikro,

das mit out-file hab ich bei mir aufgenommen, gerade die Encodierung könnte mir später aufstoßen face-wink
Den PARAM lasse ich aber dennoch weg, da die Verzeichnisse eigentlich fest bleiben und auch anderslautender Aufruf vorgesehen ist. Behalte ich aber mal auf alle Fälle im Hinterkopf.

Auf das mit dem Counter wäre ich wahrscheinlich nie gekommen, aber super. Skript macht nun eigentlich das was es soll.
Vielen Dank
Mitglied: erikro
erikro 17.10.2018 um 08:28:30 Uhr
Goto Top
Moin,

Zitat von @Forseti2003:
das mit out-file hab ich bei mir aufgenommen, gerade die Encodierung könnte mir später aufstoßen face-wink

Genau das.

Den PARAM lasse ich aber dennoch weg, da die Verzeichnisse eigentlich fest bleiben und auch anderslautender Aufruf vorgesehen ist. Behalte ich aber mal auf alle Fälle im Hinterkopf.

Sollte das mit dem Encoding ein Problem werden, dann nimm das auf jeden Fall in den PARAM-Block auf. Das andere mag ja alles feststehen, aber die Kodierung des Ergebnisses macht beim Weiterverarbeiten gerne mal Ärger. Da ist es ganz praktisch, wenn man das Skript mit -encoding ASCII aufrufen kann.

Auf das mit dem Counter wäre ich wahrscheinlich nie gekommen, aber super. Skript macht nun eigentlich das was es soll.
Vielen Dank

Gerne.

Liebe Grüße

Erik