Копирование файлов в указанную c папку, объявленную в CSV-файле, с помощью Powershell Script - PullRequest
1 голос
/ 18 марта 2020

Я довольно новичок в PowerShell и пытаюсь создать скрипт, который копирует файлы в определенные папки, которые объявлены в CSV-файле. Но до сих пор я получаю ошибки отовсюду и ничего не могу найти, чтобы решить эту проблему.

У меня есть эти папки и файлы .txt, созданные в той же папке, что и скрипт.

До сих пор я мог делать только это:

$files = Import-Csv .\files.csv 
$files
 foreach ($file in $files) {
    $name = $file.name
    $final = $file.destination
    Copy-Item $name -Destination $final   
  }

Это мой CSV

name;destination
file1.txt;folderX
file2.txt;folderY
file3.txt;folderZ

1 Ответ

1 голос
/ 18 марта 2020

Как отмечают комментарии, если вы не используете системные разделители по умолчанию, вы должны обязательно их указать.

Я также рекомендую обычно использовать кавычки для вашего csv, чтобы не было проблем со случайным включением записи это включает в себя разделитель в имени.

@"
"taco1.txt";"C:\temp\taco2;.txt"
"@ | ConvertFrom-CSV -Delimiter ';' -Header @('file','destination')

выведет

file      destination
----      -----------
taco1.txt C:\temp\taco2;.txt

Кавычки обеспечивают правильную интерпретацию значений. И да ... вы можете назвать файл foobar;test..txt. Никогда не стоит недооценивать, что могут делать пользователи. 101

Если вы берете команду Get-ChildItem | Select-Object BaseName,Directory | ConvertTo-CSV -NoTypeInformation и просматриваете вывод, вы должны увидеть ее в кавычках следующим образом.

Источник вашего списка файлов

Последний совет. Большую часть времени я сталкивался с CSV для списков ввода файлов, CSV не был необходим. Рассмотрите возможность захвата файлов, которые вы используете в самом скрипте.

Например, если у вас есть папка и вам нужно отфильтровать список, вы можете легко сделать это на лету в PowerShell, используя Get-ChildItem .

Например:

$Directory = 'C:\temp'
$Destination = $ENV:TEMP
Get-ChildItem -Path $Directory -Filter *.txt -Recurse | Copy-Item -Destination $Destination

Если вам нужно более детальное управление соответствием, рассмотрите возможность использования командлета Where-Object и выполните что-то вроде этого:

Get-ChildItem -Path $Directory -Filter *.txt -Recurse | Where-Object Name -match '(taco)|(burrito)' | Copy-Item -Destination $Destination

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

пример

Используя такие методы, вы сможете получить файлы из 2 каталогов отфильтруйте совпадение и скопируйте все в короткое утверждение, подобное этому:

Get-ChildItem -Path 'C:\temp' -Filter '*.xlsx' -Recurse | Where-Object Name -match 'taco' | Copy-Item -Destination $ENV:TEMP -Verbose

Надеюсь, что у вас появятся другие идеи! Добро пожаловать в стек переполнения. ?

...