簡體   English   中英

如何將 SwitchParameter 傳遞給 Powershell 中的 function?

[英]How do I pass a SwitchParameter to a function in Powershell?

如何將 SwitchParameter 傳遞給 function?

function schtsk( $triggers ) {
 $trigger = New-ScheduledTaskTrigger $triggers
}
schtsk -AtStartup

編輯:更簡單的問題,

$trigger "-AtStartup"
$trigger = New-ScheduledTaskTrigger $trigger

錯誤:無法將值“System.String”轉換為類型“System.Management.Automation.SwitchParameter”

您正在做的是在非參數化 function 中定義一個變量。 在 function 中定義所有可能性在 PowerShell 幫助文件中。

關於函數

開關參數

開關是不需要值的參數。 相反,您鍵入 function 名稱,后跟開關參數的名稱。

要定義開關參數,請在參數名稱前指定類型 [switch],如下例所示:

function Switch-Item {
  param ([switch]$on)
  if ($on) { "Switch on" }
  else { "Switch off" }
}

另請參閱: 關於高級功能了解更多 function 功能和關於高級功能參數

根據您下面的“困惑”評論進行更新

像這樣的東西只是一個例子。 不管你叫你的function,你必須使用參數塊才能使用開關。 這個 function 可以很容易地被稱為......

function MyNewFangledSwitchTag {
  param ([switch]$on)
  if ($on) { "Switch on" }
  else { "Switch off" }
}

......這將是同樣的事情,並使用相同的方式......

MyNewFangledSwitchTag  -on

然而,永遠不要使用這樣的東西。 始終使用正確的動詞-名詞命名約定。

只需將您的 function 重構為與示例相同,名稱無關緊要,除了使用提到的正確約定。

function New-MySchtsk 
{
    Param 
    (
        [switch]$AtStartUp
    )

    if ($AtStartUp) 
    { 
        'AtStartup switch used' 
         # Put the rest of your code actions here
         # $trigger = New-ScheduledTaskTrigger $triggers
    }
    else
    { 
        'AtStartup switch was not used' 
         # Put the rest of your code actions here
    }
}

New-MySchtsk -AtStartUp

一個開關參數大約是一個state。 這是文檔告訴你的。 您不能在其上分配/使用其他任何東西,因為這不是它的目的。 如果使用了開關,則運行代碼塊,如果沒有,則不執行任何操作,或運行其他代碼塊。

這與在測試代碼或任何其他可用於任何內置 cmdlet 的開關時使用 -WhatIf 開關相同。 您可以在 Microsoft PowerShell github 上查看 Powershell 源代碼,以了解 cmdlet 在幕后的作用以及如何實現、使用參數等。

您可以使用-switch:$bool來實現這一點,如此處所建議,但除了 static $True 和 $False 之外,您還可以使用自己的變量。 結果是您只需定義一次 cmdlet/代碼。

我將它與 Format-Table 一起使用,僅在循環中第一次顯示表頭,該循環應在每個訂單后顯示訂單行。

$intIndex = 0;
$arrayOrders | ForEach-Object -Process `
{  
    # Only show table headers first time
    If($intIndex++ -eq 0) {
        $boolHideTableHeaders = $False }
    Else {
        $boolHideTableHeaders = $True }

    # Show current order
    $_ | Format-Table -HideTableHeaders:$boolHideTableHeaders `
        @{ Name = "No.";                Expression = {  $_.orderNumber                  } },
        @{ Name = "Date";               Expression = {  $_.date                         } },
        @{ Name = "Net amount";         Expression = {  '{0, 10:N2}' -f $_.netAmount    } }

    # Show order lines after each order
    Write-Line "Order lines..."
}

嘗試這個

PS> $taskTrigger = Invoke-Expression "New-ScheduledTaskTrigger $ScheduleArgs"
PS> $taskTrigger

Enabled            : True
EndBoundary        :
ExecutionTimeLimit :
Id                 :
Repetition         :
StartBoundary      : 2021-01-07T05:00:00Z
DaysInterval       : 1
RandomDelay        :
PSComputerName     :

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM