Возьмите набор результатов (например, listofcomputers.txt) и выполните команду copy-item для каждого элемента набора результатов.

Привет всем: это то, что я пытаюсь сделать.... Возьмите набор результатов (например, listoffailedcomputers.txt) и выполните команду копирования для каждого элемента в наборе результатов. Логика заключается в том, чтобы выполнить команду копирования на всех компьютерах в этом faillistofcomputers.txt, чтобы в результате в результате эта папка была скопирована локально на все компьютеры в этом списке. Я могу сделать это с помощью удаленной консоли на всех этих компьютерах, но это не будет эффективным. Благодарю вас.

Вот код, который я написал до сих пор.......

$failedcomputers = gc c:\listoffailedcomputers.txt
foreach ($failedcomputer in $failedcomputers)
{
$failedcomputer | copy-item \\server\patch\*.* -destination c:\patch\
}

И это ошибка, которую я получаю......

Copy-Item : The input object cannot be bound to any parameters for the command 
either because the command does not take pipeline input or the input and its
properties do not match any of the parameters that take pipeline input.
At copypatchtofailedcomputers.ps
+ $failedcomputer | copy-item <<<<  \\server\patch\ -destination c:\patch\
    + CategoryInfo          : InvalidArgument: (mycomputername:PSObject) [Copy- 
   Item], ParameterBindingException
    + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Command 
   s.CopyItemCommand

Если я удалю канал между переменной $ failedcomputer и командой copy-item в моем операторе, я получу неожиданную ошибку токена.

3 ответа

Решение

Другая возможность:

$failedcomputers = gc c:\listoffailedcomputers.txt

$CmdParams = 
@{ 
   ClassName  = 'Win32_Process'
   MethodName = 'Create'
   Arguments  = @{ CommandLine = 'copy \\server\patch\*.* c:\patch\' }
 }


Invoke-CimMethod @CmdParams -ComputerName $failedcomputers

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

Вы не можете просто передать имя компьютера в любой командлет и ожидать, что он поймет, как его использовать. Copy-Item даже не включает в себя -ComputerName параметр. Вы можете попробовать два подхода

Вы можете удаленно выполнить copy-item на каждом компьютере, вот так:

$failedcomputers = gc c:\listoffailedcomputers.txt
foreach ($failedcomputer in $failedcomputers)
{
    Invoke-Command -ComputerName $failedcomputer -ScriptBlock { copy-item \\server\patch\*.* -destination c:\patch\ }
}

Или, если у вас есть доступ к файлам со всех удаленных компьютеров с вашего компьютера, вы можете попытаться скопировать напрямую из одного сетевого ресурса в другой (конечный компьютер), например так:

$failedcomputers = gc c:\listoffailedcomputers.txt
foreach ($failedcomputer in $failedcomputers)
{
    copy-item \\server\patch\*.* -destination "\\$failedcomputer\c$\patch\"
}

Если вы посмотрите на Get-Help Copy-Item -full в ISE он говорит вам, что он может принять на конвейере. Вы можете передать строку, содержащую путь к Copy-ItemProperty. В этом случае вы фактически указываете имя хоста, поэтому вы получаете эту ошибку.

Попробуй это:

    copy-item \\server\patch\*.* -destination \\$failedcomputer\C$\patch
Другие вопросы по тегам