
Windows に列ヘッダー情報を含む CSV ファイル (実際にはセミコロンで区切られています) があります。列の 1 つに部分的なファイル名が含まれています。これはパスや拡張子のないファイル名です。その列を読み取り、その列にリストされているすべてのファイルを共有フォルダーからローカル フォルダーにコピーする PowerShell または Robocopy スクリプトを作成しようとしていますが、うまくいきません。
入力ファイルは次のようになります
COL1;COL2;COL3;COL4;COL5
COL2
拡張子のないファイル名が含まれます。
必要なファイルはすべてファイル サーバー上のどこかにあります\\server\share\folder\
が\\server\share\folder\subfolder
、正確なソース ディレクトリはわかりません。
COL2
を読み取り、拡張子として追加し.pdf
、 などのファイルをローカル ドライブにコピーするPowerShell または Robocopy スクリプトを作成できますか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 ファイルにはヘッダーがありません。
- 部分的なファイル名には、コピーするファイルを見つけるために必要なサブフォルダー情報がすべて含まれています。
- すべてのアイテムを temp フォルダーのサブフォルダーに配置しようとしています。
これらの仮定が間違っている場合は、書き直す必要があります。
答え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"
}
}