在Start-Job的ArgumentList中传递一个开关

时间:2016-12-06 17:07:14

标签: powershell

我编写了一个脚本来帮助我删除Azure VM以及随之而来的所有内容(NIC,IP,磁盘等)。目前,该脚本运行良好,但由于VM可能需要4-5分钟才能删除,因此在删除多个VM时,我尝试更新脚本以并行运行。

脚本的参数如下所示,为了安全起见,ID和名称之类的内容被删除了。

[CmdletBinding()]
Param (
    [Parameter(Mandatory=$false)]
    [string]$SubscriptionId = '[an id]',

    [Parameter(Mandatory=$true)]
    [string]$ResourceGroupName,

    [string]$VmName,

    [ValidateScript({ 
        if ($VmName -eq $null -or $VmName -eq '') {
            throw "The -Force switch cannot be used without specifying -VmName."
        }
        else { $true }
    })]
    [switch]$Force,

    [Parameter(Mandatory=$false)]
    [string]$ScriptPath
)

我需要使用$ ScriptPath,因为在使用Start-Job调用脚本时不会填充$ PSScriptRoot。

我使用以下方法调用此脚本:

$jobArgs = @($SubscriptionId,$ResourceGroupName,$VmName,$true)
$newJob = Start-Job -FilePath ".\Remove-VmAndAssets2.ps1" -ArgumentList $jobArgs

我没有发送$ ScriptPath的原因是因为如果我这样做,它声称它无法找到要绑定的参数。这对我来说似乎很奇怪,所以我把它减少到四个参数,我脚本中的第一段代码是将参数转储到一个文件中(因为我无法在Job中看到实时输出)。在如上所述调用脚本后检出脚本所引用的参数,显示如下:

    Subscription ID: [the right ID]
Resource Group Name: [the right name]
            VM Name: [the right name]
              Force: False
        Script Path: True

它接受我的第四个参数$ true,并将其传递到第五个位置。无论我做什么,我都无法击中那些 - 强制切换。我已经尝试过" -Force:$ true"," Force"," -Force"," -Force $ true", " -Force = $真&#34 ;.我能想到的一切。我已尝试在" -SubscriptionId $ SubscriptionID"等中发送参数,但随后参数的值最终成为字符串。

我错过了什么?

编辑:更新了$ Force上的ValidateScript以反映我实际拥有的内容。

0 个答案:

没有答案