我在 Windows 中有一个 CSV 文件(实际上是用分号分隔的),其中包含列标题信息。其中一列包含部分文件名;它是没有路径或扩展名的文件名。我一直在尝试创建一个 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"
}
}