none
Bes. Dateityp aus Verzeichnis kopieren, umbenennen und in Zielverzeichnis speichern RRS feed

  • 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
    }


    Donnerstag, 10. September 2020 10:58

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''

    Donnerstag, 10. September 2020 11:14

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''

    Donnerstag, 10. September 2020 11:14
  • 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
    }


    Donnerstag, 10. September 2020 13:44
  • 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

    Donnerstag, 10. September 2020 14:43
  • 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''

    Donnerstag, 10. September 2020 15:01
  • Danke euch beiden! Werde ich nächste Woche testen, sobald ich wieder Zugriff auf das Netzwerk habe.
    Freitag, 11. September 2020 10:34
  • 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.

    Ihr hattet Recht! Vielen Dank für eure Hilfe. Läuft alles wie es soll! 
    Mittwoch, 23. September 2020 14:07
  • 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
    Donnerstag, 24. September 2020 11:08
  • Hat sich erledigt. Ich hab es mit einer if-Schleife gelöst!
    Nochmals Danke für eure Hilfe!
    Donnerstag, 24. September 2020 13:37