【问题标题】:Powershell Pipeline Processing - $_ Works but $ParamName Does NotPowershell 管道处理 - $_ 有效,但 $ParamName 无效
【发布时间】:2020-02-24 21:21:56
【问题描述】:

我无法理解这种行为...

给定这样的 Powershell 脚本(使用实际代码更新)...

[cmdletbinding(DefaultParameterSetName="Default")]
param (
    [cmdletbinding()]

    [Parameter( Mandatory=$true, 
                ValueFromPipeline = $true,
                ParameterSetName="Default")]
    [Parameter(Mandatory=$true, ParameterSetName="Azure")]
    [Parameter(Mandatory=$true, ParameterSetName="AWS")]                
    [Alias("Server")]
    [String[]] $SqlServer,

    # other parameters
)

BEGIN {} 
PROCESS {


    <# *************************************
    PROCESS EACH SERVER IN THE PIPELINE
    **************************************** #>
    Write-Debug "Processing SQL server $_..."
        # GET SMO OBJECTS
    $Error.Clear()
    try {
        # GET CONNECTION TO TARGET SERVER
        $_svr = _get-sqlconnection -Server $_ -Login $DatabaseLogin -Pwd $Password

        # PROCESS DATABASES ON SERVER
    } catch {

        $Error

    }
} END {}

据我了解,$_ 是管道中的当前对象,我想我理解为什么“Write-Host $_”有效。但是为什么“Write-Host $InputVariable”输出的是空字符串呢?

我必须如何定义参数,以便我可以通过管道和命名参数(即 - ./script.ps -InputVariable "something")传递值?

这有效:“someservername”| 。/脚本 这不起作用:./script -SqlServer "someservername"

谢谢。

【问题讨论】:

  • 提供的代码没有按原样运行。
  • 请修复param 块中的问题([cmdletbinding] -> [cmdletbinding()], Paramter -> Parameter)并告诉我们 1) 您使用的是哪个版本的 PowerShell看到这种行为和 2) 你传递给脚本的输入:)
  • 在进行@MathiasR.Jessen 提到的修复后,代码按预期工作。 IE。 Write-Host $_ Write-Host $InputVariable 在提供非空输入时输出非空字符串。
  • @bprocket 您正在运行的实际代码是什么?我感觉您在此处提供的示例与您在其中观察问题的代码大不相同。
  • 代码示例已更新。我试图在代码示例中不要过于冗长。如果有帮助,请告诉我。

标签: powershell pipeline


【解决方案1】:

$_ 仅在处理管道输入时填充。

如果你想同时接受:

"string","morestrings" | ./script.ps1
# and
./script.ps1 -MyParameter "string","morestrings"

...然后使用以下模式:

[CmdletBinding()]
param(
    [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
    [string[]]$MyParameter
)

process {
    foreach($paramValue in $MyParameter){
        Write-Host "MyParameter: $paramValue"
    }
}

【讨论】:

  • "string","morestrings" | ./script.ps1 -myparameter { $_ } :)。
猜你喜欢
  • 2016-02-16
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多