Не удается заставить мою задачу копирования powershell работать

#powershell #copy-item

#powershell #копировать-элемент

Вопрос:

У меня возникли некоторые проблемы с PS. Я пытаюсь скопировать папку со своего компьютера в список других компьютеров в той же сети. Если я выполню команду против имени компьютера, введя имя компьютера (назначения), PS скопирует папку. Если я использую следующую команду, результатом будет ошибка «Сетевой путь не найден»

Если я выполняю команду на одном компьютере одновременно, копирование выполняется успешно. Вот так:

 Copy-Item -Path $FileLocation -Destination \computernameC$
  

Но если я сделаю это таким образом, я получу сообщение об ошибке:

 $pc | % {copy-item -path $filelocation -destination "\$_.assetnameC$"}
  

Вот шаги, предпринятые для перехода к строке выше:

 $pc = import-csv desktop365list.csv
  

Заголовок столбца в csv — это AssetName .
Затем я определяю путь к файлу в папке

 $FileLocation = c:\users<username>desktopodt 
  

«odt» — это имя папки, которую я пытаюсь скопировать в список компьютеров в csv

 $pc | % {copy-item -path $filelocation -destination "\$_.assetnameC$"}
  

Я также пробовал без кавычек:

 $pc | % {copy-item -path $filelocation -destination \$_.assetnameC$}
  

и я получаю ту же ошибку. Что я делаю не так с этой простой задачей копирования?

Ответ №1:

Вам нужно заключить ее во вложенное выражение.

 $pc | Foreach-Object {copy-item -path $filelocation -destination "\$($_.assetname)C$"}
  

Только базовая переменная может быть расширена без нее внутри строки. Без строки в scriptblock это приведет к ошибке. Хороший способ устранения неполадок — просто вывести и посмотреть, соответствует ли это вашим ожиданиям

 $pc | Foreach-Object {"\$($_.assetname)C$"}
  

Посмотрите этот тест

 $pc = @'
assetname
test
'@ | ConvertFrom-Csv

$pc | ForEach-Object {"\$_.assetnamec$"}

\@{assetname=test}.assetnamec$
  

Без кавычек

 $pc | ForEach-Object {\$_.assetnamec$}

The network path was not found
At line:1 char:23
  $pc | ForEach-Object {\$_.assetnamec$}
  

Наконец, с подвыражением

 $pc | ForEach-Object {"\$($_.assetname)c$"}

\testc$