
Ich habe eine CSV-Datei (eigentlich durch Semikolon getrennt) in Windows mit Spaltenkopfinformationen. Eine der Spalten enthält einen Teil des Dateinamens; es ist ein Dateiname ohne Pfad oder Erweiterung. Ich habe versucht, ein PowerShell- oder Robocopy-Skript zu erstellen, das diese Spalte liest und alle in dieser Spalte aufgelisteten Dateien aus einem freigegebenen Ordner in einen lokalen Ordner kopiert, aber ich bekomme es nicht zum Laufen.
So sieht die Eingabedatei aus
COL1;COL2;COL3;COL4;COL5
COL2
enthält Dateinamen ohne Erweiterung.
Alle benötigten Dateien liegen irgendwo auf dem Dateiserver \\server\share\folder\
oder \\server\share\folder\subfolder
– ich kenne das genaue Quellverzeichnis nicht.
Kann ich ein PowerShell- oder Robocopy-Skript erstellen, das die liest , als Erweiterung COL2
hinzufügt und Dateien wie usw. auf mein lokales Laufwerk kopiert?.pdf
C:\temp\dest
Ich habe versucht, es folgendermaßen zum Laufen zu bringen:
$VT = Import-Csv -Path "C:\test\test.csv" -Delimiter ";" | ForEach {
copy-item -Path C:\test\source\subfolder1\$($_.COL2)*.* -Recurse -Destination C:\test\dest
copy-item -Path C:\test\source\subfolder2\$($_.COL2)*.* -Recurse -Destination C:\test\dest
copy-item -Path C:\test\source\subfolder3\$($_.COL2)*.* -Recurse -Destination C:\test\dest
copy-item -Path C:\test\source\subfolder4\$($_.COL2)*.* -Recurse -Destination C:\test\dest
}
Aber ich hätte den Code gerne einfacher und nicht mit all diesen Unterordnern im Skript. Ich habe es nicht geschafft, diese Rekursionsoption zum Laufen zu bringen Copy-Item
. Ich schätze, ich muss sie hier verwenden Get-ChildItem
, aber was ich versucht habe, ist, dass das Skript einfach alles von der Quelle zum Ziel kopiert oder ausgeführt wird und nichts tut.
Ich habe dies nur lokal getestet, daher besteht noch keine Notwendigkeit, Serverordner zu verwenden.
Antwort1
Versuchen Sie etwas in dieser Art:
Import-Csv myfile.csv -header "Col1;Col2;Col3;Col4;Col5" | % {
Copy-Item servername:\server\share\$_.pdf C:\temp\
}
Ich habe mehrere Annahmen darüber getroffen, was Sie versuchen zu tun.
- Ihre lokale Kultur wurde auf eine europäische Kultur eingestellt, sodass CSV ein Semikolon statt eines Kommas erwartet.
- In der CSV-Datei ist kein Header vorhanden.
- Der teilweise Dateiname enthält alle Unterordnerinformationen, die zum Auffinden der zu kopierenden Datei erforderlich sind.
- Sie versuchen, alle Elemente in Unterordner des Temp-Ordners zu verschieben.
Wenn diese Annahmen falsch sind, müssen Sie neu schreiben.
Antwort2
Wenn man sich die Frage ansieht, scheint es, als ob Sie etwa Folgendes möchten:
$sourcePath = '\\server\share\folder'
$destination = 'C:\temp\dest'
# make sure the destination folder exists
$null = New-Item -Path $destination -ItemType Directory -Force
# import the data, and get an string array from COL2 from it
# make sure there are no duplicates in this aray and lop through the filenames
(Import-Csv -Path "C:\test\test.csv" -Delimiter ";").COL2 | Sort-Object -Unique | ForEach-Object {
$fileName = '{0}.pdf' -f $_
# try and find this file somewhere in the source path including its subfolders
$original = Get-ChildItem -Path $sourcePath -Filter $fileName -Recurse | Select-Object -First 1
if ($original) {
$original | Copy-Item -Destination
}
else {
Write-Warning "File '$FileName' could not be found"
}
}