
У меня есть CSV-файл (на самом деле разделенный точкой с запятой) в Windows с информацией о заголовках столбцов. Один из столбцов содержит частичное имя файла; это имя файла без пути или расширения. Я пытался создать скрипт PowerShell или Robocopy, который считывает этот столбец и копирует все файлы, перечисленные в этом столбце, из общей папки в локальную, но я не могу заставить его работать.
Вот как выглядит входной файл
COL1;COL2;COL3;COL4;COL5
COL2
содержит имя файла без расширения.
Все необходимые файлы находятся где-то на файловом сервере \\server\share\folder\
или \\server\share\folder\subfolder
— я не знаю точного исходного каталога.
Могу ли я создать скрипт PowerShell или Robocopy, который считывает COL2
, добавляет .pdf
как расширение и копирует файлы на мой локальный диск, например C:\temp\dest
, и т. д.?
Я пытался заставить это работать следующим образом:
$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
}
Но я хотел бы, чтобы код был более простым и без всех этих подпапок в скрипте. Мне не удалось заставить работать эту опцию рекурсии Copy-Item
. Я предполагаю, что мне нужно будет использовать Get-ChildItem
здесь, но то, что я пробовал, скрипт просто копирует все из источника в место назначения или выполняется и ничего не делает.
Я только что протестировал это локально, поэтому пока нет необходимости использовать серверные папки.
решение1
Попробуйте что-нибудь в этом роде:
Import-Csv myfile.csv -header "Col1;Col2;Col3;Col4;Col5" | % {
Copy-Item servername:\server\share\$_.pdf C:\temp\
}
Я сделал несколько предположений относительно того, что вы пытаетесь сделать.
- Ваша локальная культура установлена на европейскую культуру, поэтому csv ожидает точку с запятой, а не запятую.
- В CSV-файле нет заголовка.
- Частичное имя файла содержит всю информацию о подпапке, необходимую для поиска копируемого файла.
- Вы пытаетесь поместить все элементы в подпапки временной папки.
Если эти предположения неверны, вам придется переписать.
решение2
Читая вопрос, создается впечатление, что вы хотите что-то вроде этого:
$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"
}
}