Powershell:在管道中间休眠



我需要在两组代码之间添加一个(相对)小的暂停,因为后半部分需要在运行前成功执行前半部分—但是PowerShell有时会提前一点,在前一个命令完全完成之前继续执行。

只是为了上下文,这是我正在使用的代码:

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false `
      | New-Partition -DriveLetter D -UseMaximumSize

这通常会失败,因为在PowerShell执行New-Partition时驱动器还没有完全初始化。

我通常会这样写:

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false
Start-Sleep -Seconds 2
New-Partition -DriveLetter D -UseMaximumSize

然而,问题是Initialize-Disk的输出对象丢失,New-Partition没有得到输入对象。

我试着把Start-Sleep放在管道里:

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false `
      | Start-Sleep -Seconds 2 `
      | New-Partition -DriveLetter D -UseMaximumSize

…但是它会抛出一个异常,因为Start-Sleep不知道如何理解输入对象(这很公平)。

Start-Sleep : 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 C:UsersAdministratorDesktoptest.ps1:104 char:87
+ ... nfirm:$false | Start-Sleep -Seconds 2 `
+                    ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (MSFT_Disk (Obje...11E2-93F2-0...):PSObject) [Start-Sleep], ParameterBindingException
    + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.StartSleepCommand

tl;dr:我如何在我的代码中添加暂停,同时保持前面cmdlet的输出对象?

您可以尝试使用后台作业:

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false -asjob |
wait-job | receive-job | New-Partition -DriveLetter D -UseMaximumSize

您也可以尝试(未经测试):

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false |
    % { Start-Sleep -Seconds 2 | Out-Null; $_ } |
    New-Partition -DriveLetter D -UseMaximumSize

如果您想为管道中的每个项目休眠给定的秒数,您可以像graemer建议的那样使用ForEach-Object。如果你只想在给定的秒数内休眠,而不管管道中有多少项,你必须打破管道:

$disks = Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false
sleep 2
$disks | New-Partition -DriveLetter D -UseMaximumSize

这对我有用(类似于另一个答案):

New-Partition … | ForEach-Object { Start-Sleep -s 3; $_ | Format-Volume … }

最新更新