繁体   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