Benutzer mit den meisten Antworten
Bes. Dateityp aus Verzeichnis kopieren, umbenennen und in Zielverzeichnis speichern

Frage
-
Liebe Community,
ich möchte aus einem Quellverzeichnis, in dem verschiedene Dateitypen liegen, alle txt-Dateien herauskopieren, den ursprünglichen Dateinamen mit einer bestimmten Variablen (sofern vorhanden) erweitern und in einem Zielverzeichnis ablegen. Sollte die Variable nicht definiert sein, soll der ursprüngliche Dateiname erhalten bleiben, die Datei aber trotzdem ins zielverzeichnis kopiert werden.
Wie bekomme ich nur bestimmte Dateitypen? Mein bisheriger Code kopiert alles aus dem Quellverzeichnis.
try { $Variable = "Wert" #Wert nicht immer vorhanden $targetPath = 'C:/Ziel/' Get-ChildItem $tempPath | ForEach-Object { $targetName = $_.BaseName + $_.Variable + $_.Extension $target = Join-Path -Path $targetPath -ChildPath $targetName Copy-Item -Path $_.FullName -Destination $target -ErrorAction Stop Write-Log -Message "Copy successful" -Path $logFile } } catch { Write-Log -Message "ERROR! Copy failed" -Path $logFile }
Antworten
-
Hallo Uzer257 und Willkommen im Deutschen Microsoft Powershell Forum.
Ich empfehle Dir, IMMER die komplette Hilfe für die cmdlets zu lesen, die Du benutzen willst ... inklusive der Beispiele. Das cmdlet Get-ChildItem hat einen Parameter -Filter.
try { $Variable = 'Wert' #Wert nicht immer vorhanden $targetPath = 'C:\Ziel' Get-ChildItem -Path $tempPath -Filter *.txt | ForEach-Object { $targetName = $_.BaseName + $Variable + $_.Extension $target = Join-Path -Path $targetPath -ChildPath $targetName Copy-Item -Path $_.FullName -Destination $target -ErrorAction Stop Write-Log -Message "Copy successful" -Path $logFile } } catch { Write-Log -Message "ERROR! Copy failed" -Path $logFile }
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 26. September 2020 06:45
Alle Antworten
-
Hallo Uzer257 und Willkommen im Deutschen Microsoft Powershell Forum.
Ich empfehle Dir, IMMER die komplette Hilfe für die cmdlets zu lesen, die Du benutzen willst ... inklusive der Beispiele. Das cmdlet Get-ChildItem hat einen Parameter -Filter.
try { $Variable = 'Wert' #Wert nicht immer vorhanden $targetPath = 'C:\Ziel' Get-ChildItem -Path $tempPath -Filter *.txt | ForEach-Object { $targetName = $_.BaseName + $Variable + $_.Extension $target = Join-Path -Path $targetPath -ChildPath $targetName Copy-Item -Path $_.FullName -Destination $target -ErrorAction Stop Write-Log -Message "Copy successful" -Path $logFile } } catch { Write-Log -Message "ERROR! Copy failed" -Path $logFile }
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 26. September 2020 06:45
-
Hallo BOfH-666, vielen Dank für die nette Begrüßung und die schnelle Hilfe. Klappt prima.
Ich bin allerdings schon auf das nächste Hindernis gestoßen.
Ich möchte prüfen ob der Variablen bereits ein (sechsstelliger)Wert zugewiesen wurde. Wenn dem so ist, dann sollen die Dateinamen mit diesem Wert erweitert werden. Wenn die Variable keinen Wert oder null ist, sollen die Dateien ohne Namenserweiterung in den Zielordner, und wenn beides nicht klappt soll die Fehlermeldung kommen.
Im Test: Gibt es keinen Wert für die Variable kopiert er korrekt. Hat die Variable aber einen Wert kam eine Fehlermeldung. ... irgendetwas mit "foreach[0]"
try { $Variable = $Version $targetPath = 'C:\Ziel' if ($Variable) { Get-ChildItem -Path $tempPath -Filter *.txt | ForEach-Object { $targetName = $_.Variable + $_.BaseName + $_.Extension $target = Join-Path -Path $targetPath -ChildPath $targetName Copy-Item -Path $_.FullName -Destination $target -ErrorAction Stop Write-Log -Message "Copy successful" -Path $logFile} } } else { Copy-Item $tempPath\* -Include *.txt -Destination $targetPath -ErrorAction Stop Write-Log -Message "Copy without Variable successful" -Path $logFile } catch { Write-Log -Message "ERROR! Copy failed" -Path $logFile }
-
irgendetwas mit "foreach[0]"
Dann änder doch mal irgenwas... Spaß beiseite: Fehlermeldungen gern im Wortlaut.
Und um Dir zu helfen - in dieser Zeile steckt der Fehler:
$targetName = $_.Variable + $_.BaseName + $_.Extension
Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq
-
Und um Dir zu helfen - in dieser Zeile steckt der Fehler:
$targetName = $_.Variable + $_.BaseName + $_.Extension
Deshalb hatte ich das in meinem Code-Vorschlag schon korrigiert!! ;-)
@Uzer257 ... teste doch einfach mal den Code so wie ich ihn gepostet hatte.
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
-
Und um Dir zu helfen - in dieser Zeile steckt der Fehler:
$targetName = $_.Variable + $_.BaseName + $_.Extension
Deshalb hatte ich das in meinem Code-Vorschlag schon korrigiert!! ;-)
@Uzer257 ... teste doch einfach mal den Code so wie ich ihn gepostet hatte.
-
Eine Frage hätte ich nun doch noch.
Ich würde gerne die Reihenfolge der Namensteile noch ändern. Wenn die Variable $Variable existiert soll sie ganz vorne stehen.
$targetName = $Variable + $_.BaseName + $_.Extension
Zudem soll die Variable vom ursprünglichen Namen mittels einer # getrennt sein. Bisheriger Ansatz:
$targetName = $Variable + "#" + $_.BaseName + $_.Extension
Wenn ich das so teste, und die Variable keinen Wert hat, wird eine 1 ausgegeben und (das war mir zwar klar) immer die Raute # . Was müsste ich ändern, dass wenn die Variable keinen Wert hat, weder die 1, noch die Raute # eingefügt wird. Also nur $_.BaseName + $_.Extension
- Bearbeitet Uzer257 Donnerstag, 24. September 2020 11:59 Korrektur