#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$