为什么这个 powershell 代码在 PS 中单独运行,但在脚本中却失败?

为什么这个 powershell 代码在 PS 中单独运行,但在脚本中却失败?

我在构建机器上运行的部署脚本中有此块。它应该将暂存机器上的文件从 Installs 文件夹移动到应用程序文件夹。
在此块之前,还有几个操作已通过 Invoke-Session 成功执行

write-host "Deploying" -foregroundcolor red -backgroundcolor yellow
invoke-command -session $s {
    Get-ChildItem -Path "C:\Install\pre_master" | Copy-Item -Destination "C:\inetpub\wwwroot\pre_master" -force -Recurse 
}

如果我在 PS 中手动创建一个会话并粘贴此块,它就可以正常工作。

如果我运行该脚本,这一步会向我发送数百万个垃圾邮件(我想对于我试图移动的每个文件来说都是如此?)

输入对象无法绑定到命令的任何参数,因为该命令不接受管道输入,或者输入及其属性与接受管道输入的任何参数不匹配。+ CategoryInfo : InvalidArgument: (0201-KS.xml:PSObject) [Copy-Item],ParameterBindingException + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.CopyItemCommand

所以我的问题是:为什么相同的代码块在 PS 中手动执行时可以工作,但在脚本中却不起作用?

两台机器都有 powershell 2.0

答案1

我仍然不知道为什么,但是当您使用远程会话运行某些 cmdlet 时,您无法使用管道。您可以先将 cmdlet 的结果存储在变量中,然后编写 foreach 循环以将该 cmdlet 的结果传输到另一个 cmdlet。

例如,您可以先将 cmdlet 的结果存储在变量中,然后编写 foreach 循环来复制文件:

invoke-command -session $s {
    $files = Get-ChildItem -Path "C:\Install\pre_master"; Foreach($file in $files) { Copy-Item -Path $file -Destination "C:\inetpub\wwwroot\pre_master" -force Recurse} 
} 

相关内容