1

大家好:这就是我正在尝试做的......获取结果集(例如listoffailedcomputers.txt)并在结果集中的每个项目上运行复制命令。逻辑是在failedlistofcomputers.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 命令之间的管道,我会得到一个意外的令牌错误。

4

3 回答 3

5

您不能只是将计算机名通过管道传输到任何 cmdlet 中并期望它了解如何使用它。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\"
}
于 2013-11-30T10:36:08.080 回答
2

Another possibility:

$failedcomputers = gc c:\listoffailedcomputers.txt

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


Invoke-CimMethod @CmdParams -ComputerName $failedcomputers

That should multi-thread it, without the overhead of spinning up a bunch of remote PS instances just to do a file copy.

于 2013-11-30T14:58:02.687 回答
1

如果您查看Get-Help Copy-Item -fullISE 中的内容,它会告诉您它可以在管道上接受什么。您可以通过管道传输包含 Copy-ItemProperty 路径的字符串。在这种情况下,您实际上是在管道传输主机名,这就是您收到该错误的原因。

尝试这个:

    copy-item \\server\patch\*.* -destination \\$failedcomputer\C$\patch
于 2013-11-30T10:35:44.720 回答