none
Dateinamen suchen anhand einer Liste mit Teile des Dateinamens um diese zu kopieren RRS feed

  • Frage

  • Hallo,

    ich wollte gerade ein kleines Script basteln, welche Dateien nach Namen sucht anhand einer vorgegebenen Textdatei oder CSV.

    In der Liste sind einzelne Dateinamen, allerdings nicht der komplette Name, sondern Teile des Dateinamens.

    Nur funktioniert das nicht so wie ich mir das gedacht habe. (das Copy Item ist noch nicht angepasst)

    $source = 'X:\quelle'
    $destination = 'X:\ziel'
    $list = get-content 'X:\Test\test.txt'

    $content=Get-content X:\test.txt | Foreach-Object {$_} 

    foreach($item in (Get-ChildItem -Recurse -Path $source | Where-Object {$_.Name -like $content}))
    {
       copy-item -Path $item -Destination $destination 
    }


    Dienstag, 10. März 2020 15:43

Antworten

  • Hi,

    du kannst bei get-childitem schon auf Dateimuster filtern, wenn es um Namen und/oder Endungen geht.

    Also z.B.:

    get-ChildItem *"$source"*

    Dann pipst du deine Ausgabe an select *. Hier ist zuerstmal Best Practice cmdlets auszuschreiben statt Aliases zu verwenden, wenn du Code veröffentlichst.

    Zweitens, wenn du eh alles ausgeben/verarbeiten willst, brauchst du nicht mit select-item alles auswählen.

    Dein Input enthält eh schon alles, was du vorher mit Get-ChildItem gefunden hast, kannst du dir also auch sparen.

    Bleibt noch die Ausgabe auf der Konsole. Wenn du deinen Output nicht außerhalb der der Schleife weiter verabreiten willst, kannst du ihn auch direkt an write-host pipen.

    Also z.B.:

    $source = 'X:\quelle'
    $destination = 'X:\ziel'
    $list = 'X:\Test\test.txt'
    
    $name = Get-Content -Path @($list)
    foreach($item in $name)
    {
    Get-ChildItem -Recurse -Path *"$source"* | write-host
    }
    

    Gruß

    • Als Antwort markiert coraxx Mittwoch, 11. März 2020 15:02
    Mittwoch, 11. März 2020 12:33

Alle Antworten

  • Je nach Inhalt Deiner beiden Text-Dateien, könnte es sein, dass Dir das cmdlet Compare-Object weiterhilft. Schau es Dir mal an, spiel ein bissl damit und wenn Du nicht weiterkommst, fragst Du hier wieder. ;-)

    Wenn Du hier code oder Beispieldaten oder Konsolen-Output postest, formatier das doch bitte als Code. How to Use the Code Feature in a TechNet Forum Post.

    Danke schon mal


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 10. März 2020 16:04
  • Probier's mal mit -match statt -like. Was bezweckst Du mit dem Foreach-Object nach Get-Content?

    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

    Mittwoch, 11. März 2020 10:02
  • Vielen Dank für Eure Hilfe. Danke für den Tip mit Foreach-Object, da hatte ich einen kleinen Denkfehler. Habe dies nun in ein Array gepackt und damit kann man dann auch gepflegt weiterarbeiten.Dies war/ist zur Weiterverarbeitung als Kopier Job gedacht, also Ordner durchsuchen nach bestimmten Dateien, Datei finden und dann in einen anderen Ordner kopieren.

    $source = 'X:\quelle'
    $destination = 'X:\ziel'
    $list = 'X:\Test\test.txt'
    
    $name = Get-Content -Path @($list)
    foreach($item in $name)
    {
     $path=Get-ChildItem -Recurse -Path $source | Where-Object {$_.Name -like $item} | select *
     write-host $Path
    } 

    Vielen Dank


    Mittwoch, 11. März 2020 12:08
  • Hi,

    du kannst bei get-childitem schon auf Dateimuster filtern, wenn es um Namen und/oder Endungen geht.

    Also z.B.:

    get-ChildItem *"$source"*

    Dann pipst du deine Ausgabe an select *. Hier ist zuerstmal Best Practice cmdlets auszuschreiben statt Aliases zu verwenden, wenn du Code veröffentlichst.

    Zweitens, wenn du eh alles ausgeben/verarbeiten willst, brauchst du nicht mit select-item alles auswählen.

    Dein Input enthält eh schon alles, was du vorher mit Get-ChildItem gefunden hast, kannst du dir also auch sparen.

    Bleibt noch die Ausgabe auf der Konsole. Wenn du deinen Output nicht außerhalb der der Schleife weiter verabreiten willst, kannst du ihn auch direkt an write-host pipen.

    Also z.B.:

    $source = 'X:\quelle'
    $destination = 'X:\ziel'
    $list = 'X:\Test\test.txt'
    
    $name = Get-Content -Path @($list)
    foreach($item in $name)
    {
    Get-ChildItem -Recurse -Path *"$source"* | write-host
    }
    

    Gruß

    • Als Antwort markiert coraxx Mittwoch, 11. März 2020 15:02
    Mittwoch, 11. März 2020 12:33
  • Moin,

    Das Filtern funktioniert leider nicht mit Wildcards. Das Problem bestand darin, dass eine Datei vorhanden war, welche nur Teile des Dateinamens enthielt und danach gesucht werden sollte und danach weiterverarbeitet wird.. Daher war kein Filter möglich. Bei bestimmten Dateiendungen etc. ist dies natürlich perfekt.

    Das Select-Item war noch für die Ausgabe eingepflegt und wurde auch nur zum Anzeigen der Attribute genutzt, dies hatte ich vergessen herauszunehmen.

    Vielen Dank für deine Hilfe :).

      

    Mittwoch, 11. März 2020 13:18