CSV をソースとして使用してファイルをコピーする

CSV をソースとして使用してファイルをコピーする

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\
    }

あなたが何をしようとしているのかについて、私はいくつかの仮定を立てました。

  1. ローカル文化はヨーロッパ文化に設定されているため、csv ではコンマではなくセミコロンが想定されます。
  2. csv ファイルにはヘッダーがありません。
  3. 部分的なファイル名には、コピーするファイルを見つけるために必要なサブフォルダー情報がすべて含まれています。
  4. すべてのアイテムを 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"
    }
}

関連情報