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:
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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 389593
Url: https://administrator.de/contentid/389593
Ausgedruckt am: 25.11.2024 um 12:11 Uhr
3 Kommentare
Neuester Kommentar
Moin,
hth
Erik
# 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
Moin,
Genau das.
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.
Gerne.
Liebe Grüße
Erik
Zitat von @Forseti2003:
das mit out-file hab ich bei mir aufgenommen, gerade die Encodierung könnte mir später aufstoßen
das mit out-file hab ich bei mir aufgenommen, gerade die Encodierung könnte mir später aufstoßen
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
Vielen Dank
Gerne.
Liebe Grüße
Erik