0

不要打我太多人,我试图理解关于这个问题的其他类似问题,只是无法破译它们。

我正在使用以下代码片段在“远程”计算机上分别复制文件夹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
4

0 回答 0