Powershell Copy-Item из нескольких мест с использованием CSV для имени системы - PullRequest
0 голосов
/ 29 июня 2018

У меня есть CSV с 98 именами систем, в каждой системе есть нужный мне файл. Они все находятся в одной папке на каждом компьютере, но имя файла уникально.

Я хотел бы использовать copy-item для копирования файла в папку на моем локальном компьютере.

$AutoCADs = Import-csv "C:\DTS\BMC\AutoCAD - ANY VERSION_Members.csv"
$AutoPaths = "\\" + $AutoCADs + "\C$\DTS\BMC\Autodesk Audit\Information\*"
foreach-object{Copy-Item $AutoPaths -Destination "C:\DTS\BMC\Audit Results" -Force -Recurse}

Когда я запускаю это, я получаю сообщение об ошибке для каждой из 98 машин. Каждая ошибка выглядит так:

Copy-Item: не удается найти путь 'C: \ Users \\ @ {D113978 = Y118834}', так как он не существует. В \\ CopyAuditFiles.ps1: 3 char: 16 + ... each-object {Copy-Item $ AutoPaths -Destination "C: \ DTS \ BMC \ Audit Resul ...

@{D113978=Y118834} сбивает меня с толку, потому что каждая ошибка имеет похожую строку. D113978 - это первое имя системы в CSV.

Другое имя системы (Y118834 в этом примере) изменяется для каждой ошибки, причем первая ошибка имеет второй элемент в CSV, 2-я ошибка имеет 3-й элемент в CSV и т. Д.

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

Может кто-нибудь указать на мой недостаток?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Import-csv использует первую строку в файле для заголовков, поэтому он использует D113978 в качестве имени заголовка, а не элемента.

Я предполагаю, что ваш CSV содержит только имена компьютеров:

D113978
Y118834
D978113
Y842118

Если это так, то это на самом деле не CSV (так как у него нет заголовков), это текстовый список.

В этом случае я бы просто использовал Get-Content вместо этого, он будет просто использовать каждую строку в файле как элемент.

Затем перемещается $AutoPaths = [..] внутри foreach, поэтому он обновляется с каждым циклом:

$computers = Get-Content "C:\DTS\BMC\AutoCAD - ANY VERSION_Members.csv"

foreach ($system in $computers){
    $AutoPaths = "\\$system\C$\DTS\BMC\Autodesk Audit\Information\*"
    Copy-Item $AutoPaths -Destination "C:\DTS\BMC\Audit Results" -Force -Recurse
}
0 голосов
/ 29 июня 2018

У вас плохой CSV. Вы должны добавить headername к каждой колонке. Powershell принимает в качестве заголовка этого столбца первую строку каждого столбца, и именно поэтому вы получаете эту запутанную ошибку. Поэтому добавьте еще одну строку сверху и используйте заголовок, например «Computername».

Также $AutoCADs по сути является табличным объектом. И вы передаете всю таблицу, чтобы создать динамический сетевой путь.

Поэтому измените свой код на это:

$AutoCADs = Import-csv "C:\DTS\BMC\AutoCAD - ANY VERSION_Members.csv"

Foreach ($Row in $AutoCADs)
{
    $AutoPaths = "\\" + $($Row.Computername) + "\C$\DTS\BMC\Autodesk Audit\Information\*"
    Copy-Item $AutoPaths -Destination "C:\DTS\BMC\Audit Results" -Force -Recurse
}
...