
Windows에 열 헤더 정보가 포함된 CSV 파일(실제로는 세미콜론으로 구분됨)이 있습니다. 열 중 하나에는 부분적인 파일 이름이 포함되어 있습니다. 경로나 확장자가 없는 파일 이름입니다. 해당 열을 읽고 해당 열에 나열된 모든 파일을 공유 폴더에서 로컬 폴더로 복사하는 PowerShell 또는 Robocopy 스크립트를 만들려고 했지만 제대로 작동할 수 없습니다.
입력 파일의 모습은 다음과 같습니다.
COL1;COL2;COL3;COL4;COL5
COL2
확장자 없는 파일 이름이 포함되어 있습니다.
필요한 모든 파일은 파일 서버 어딘가에 있습니다. \\server\share\folder\
또는 \\server\share\folder\subfolder
– 정확한 소스 디렉토리를 모릅니다.
를 읽고, 확장자로 COL2
추가하고 , 와 같은 로컬 드라이브에 파일을 복사하는 PowerShell 또는 Robocopy 스크립트를 만들 수 있나요 ?.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"
}
}