5

我需要在两组代码之间添加一个(相对)小的暂停,因为后半部分需要在运行之前成功执行前半部分——但 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:\Users\Administrator\Desktop\test.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 的输出对象?

4

4 回答 4

6

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

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false -asjob |
wait-job | receive-job | New-Partition -DriveLetter D -UseMaximumSize
于 2013-03-26T09:35:08.743 回答
2

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

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false |
    % { Start-Sleep -Seconds 2 | Out-Null; $_ } |
    New-Partition -DriveLetter D -UseMaximumSize
于 2013-03-26T09:48:36.983 回答
1

如果您想为管道中的每个项目休眠给定的秒数,您可以ForEach-Object按照Graimer 的建议使用。如果您只想在给定的秒数内休眠而不考虑管道中的项目数量,则必须分解管道:

$disks = Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false
sleep 2
$disks | New-Partition -DriveLetter D -UseMaximumSize
于 2013-03-26T10:16:18.127 回答
0

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

New-Partition … | ForEach-Object { Start-Sleep -s 3; $_ | Format-Volume … }
于 2016-06-05T01:31:47.270 回答