我需要在两组代码之间添加一个(相对)小的暂停,因为后半部分需要在运行前成功执行前半部分—但是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 … }