不要打我太多人,我试图理解关于这个问题的其他类似问题,只是无法破译它们。
我正在使用以下代码片段在“远程”计算机上分别复制文件夹Start-Job
:
$Folders = @('Desktop','Documents','Favorites','Links','Downloads','Music','Videos','Pictures','Contacts')
Foreach($Folder in $Folders){
$ArgumentsArray = @()
$ArgumentsArray += "\\$Env:COMPUTERNAME\c$\Users\Abraham\$Folder"
$ArgumentsArray += "C:\CopyBackup"
$RoboCopy_Args = @("/E","/R:5","/W:1","/MT:13")
Start-Job -ScriptBlock { & C:\Windows\System32\Robocopy.exe $args[0] "$($args[1])\$using:Folder" $using:RoboCopy_Args } -ArgumentList $ArgumentsArray -Name $Folder
}
该代码按预期工作。
现在,问题是当我尝试使用远程调用Invoke-Command -AsJob
命令时。错误读取:
管道未运行,因为管道已在运行。管道不能同时运行。
在来到这里之前,我试图阅读和理解,但无法理解为什么它不起作用。奇怪的是,$Folders
阵列中的第一个文件夹(Desktop)确实被复制为作业,显示已完成,但另一个显示立即失败。所以我跑了Receive-Job -Name Documents
,是我得到上述错误的地方。
- 这与管道有什么关系?
- 有解决办法吗?
失败的代码:
$PSSession = New-PSSession -ComputerName $env:COMPUTERNAME -ErrorAction Stop
$Folders = @('Desktop','Documents','Favorites','Links','Downloads','Music','Videos','Pictures','Contacts')
Foreach($Folder in $Folders){
$ArgumentsArray = @()
$ArgumentsArray += "C:\Users\Abraham\$Folder"
$ArgumentsArray += "C:\CopyBackup"
$RoboCopy_Args = @("/E","/R:5","/W:1","/MT:13")
Invoke-Command -ScriptBlock { & C:\Windows\System32\Robocopy.exe $args[0] "$($args[1])\$using:Folder" $using:RoboCopy_Args } -AsJob -ArgumentList $ArgumentsArray -Session $PSSession -JobName $Folder
}
Get-Job
输出:
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
518 Desktop RemoteJob Running True DESKTOP-OEREJ77 & C:\Windows\System32...
520 Documents RemoteJob Failed False DESKTOP-OEREJ77 & C:\Windows\System32...
522 Favorites RemoteJob Failed False DESKTOP-OEREJ77 & C:\Windows\System32...
524 Links RemoteJob Failed False DESKTOP-OEREJ77 & C:\Windows\System32...
526 Downloads RemoteJob Failed False DESKTOP-OEREJ77 & C:\Windows\System32...
528 Music RemoteJob Failed False DESKTOP-OEREJ77 & C:\Windows\System32...
530 Videos RemoteJob Failed False DESKTOP-OEREJ77 & C:\Windows\System32...
532 Pictures RemoteJob Failed False DESKTOP-OEREJ77 & C:\Windows\System32...
534 Contacts RemoteJob Failed False DESKTOP-OEREJ77 & C:\Windows\System32...
由于它产生的事件,我想坚持将其“作为作业”运行StateChanged
,我将其用于不同的目的。
编辑:
我决定将它全部打包成一个Invoke-Command
并发送过来,但它仍然一次复制一个。
$PSSession = New-PSSession -ComputerName $env:COMPUTERNAME -ErrorAction Stop
Invoke-Command -ScriptBlock {
$Folders = @('Desktop','Documents','Favorites','Links','Downloads','Music','Videos','Pictures','Contacts')
foreach ($Folder in $Folders) {
$ArgumentsArray = @()
$ArgumentsArray += "C:\Users\Abraham\$Folder"
$ArgumentsArray += "C:\CopyBackup"
$RoboCopy_Args = @("/E","/R:5","/W:1","/MT:13")
Start-job {
& C:\Windows\System32\Robocopy.exe $args[0] "$($args[1])\$using:Folder" $using:RoboCopy_Args
} -ArgumentList $ArgumentsArray -Name $Folder
}
} -AsJob -Session $PSSession -JobName $Folder