Использование CSV в качестве источника для копирования файлов

Использование CSV в качестве источника для копирования файлов

У меня есть 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\
    }

Я сделал несколько предположений относительно того, что вы пытаетесь сделать.

  1. Ваша локальная культура установлена ​​на европейскую культуру, поэтому csv ожидает точку с запятой, а не запятую.
  2. В CSV-файле нет заголовка.
  3. Частичное имя файла содержит всю информацию о подпапке, необходимую для поиска копируемого файла.
  4. Вы пытаетесь поместить все элементы в подпапки временной папки.

Если эти предположения неверны, вам придется переписать.

решение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"
    }
}

Связанный контент