Как скопировать файл в несколько папок в PowerShell

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

Часть кода, с которой мне нужна помощь, размещена ниже.

$Source = Select-Boss

$destination = 'D:\parts','D:\labor','D:\time','D:\money'

"Calling Copy-Item with parameters source: '$source', destination: '$destination'."

Copy-Item -Path $source -Destination $destination

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

$Source = Select-Boss

$destination = 'D:\parts'

"Calling Copy-Item with parameters source: '$source', destination: '$destination'."

Copy-Item -Path $source -Destination $destination

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


person bgrif    schedule 10.07.2014    source источник


Ответы (4)


copy-item принимает только одно значение для своего параметра -destination, поэтому вам нужен цикл некоторого типа.

Предполагая, что вы хотите иметь одно и то же имя файла в нескольких папках:

$destFolders | Foreach-Object { Copy-Item -Path $Source -dest (Join-Path $_ $destFileName) }

должен сделать это.

person Richard    schedule 10.07.2014
comment
куда бы я вставил эту часть. Я хочу сохранить одно и то же имя файла в нескольких папках - person bgrif; 10.07.2014
comment
Эй, я получаю эту ошибку Join-Path: невозможно связать аргумент с параметром «Путь», потому что он равен нулю. есть идеи? - person Dharti Sutariya; 26.06.2020
comment
@DhartiSutariya Проверьте, что вы вводите — коллекция ввода пуста? - но на самом деле это должен быть новый вопрос, где вы можете показать полное воссоздание. - person Richard; 26.06.2020

Я думаю, вы хотите что-то вроде этого:

$Source = Select-Boss

$destination = @("D:\parts","D:\labor","D:\time","D:\money")

# Calling Copy-Item with parameters source: '$source', destination: '$destination'."

foreach ($dir in $destination)
{
    Copy-Item -Path $source -Destination $dir
}

Этот код создает массив папок, затем перебирает каждую из них, копируя в нее ваш файл.

person Ranic    schedule 10.07.2014
comment
Я внес изменения, которые вы предложили сделать, и они все еще не работают. что я знаю, так это Copy-Item : The given path's format is not supported. At line:9 char:22 + Copy-Item -Path $source -Destination $dir + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Copy-Item], NotSupportedException + FullyQualifiedErrorId : System.NotSupportedException,Microsoft.PowerShell.Commands.CopyItemCommand - person bgrif; 10.07.2014
comment
Каково значение $source? - person Ranic; 10.07.2014
comment
значение $source равно \\ntsrv\common\Deployments\Boss\testing.txt - person bgrif; 10.07.2014
comment
select-boss - это функция, которую я создал, которая открывает окно, которое позволяет мне перейти в папку и выбрать в ней файл, а затем сохраняет результаты после его выбора. - person bgrif; 10.07.2014
comment
Я хочу исключить какой-либо файл при копировании в последнем месте назначения, есть идеи, как мы можем это сделать? - person Dharti Sutariya; 26.06.2020

https://www.petri.com/use-powershell-to-copy-files-to-multiple-locations

dir c:\work\*.txt | copy-item -Destination $destA -PassThru | copy -dest $destB -PassThru
person Iain    schedule 09.05.2018

Это лучшее и простое решение, которое я использовал.

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

"\\foo\foo" расположение содержит 10 папок по имени пользователя. # используйте двойную косую черту (она не отображается здесь в StackOverflow)

dir "\\foo\foo\*" | foreach-object { copy-item -path d:\foo -destination $_ } -verbose

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

person Jitendramani Yadav    schedule 09.11.2014