【问题标题】:Store Arguments and Variables And Use With Command存储参数和变量并与命令一起使用
【发布时间】:2016-03-06 12:29:47
【问题描述】:

我正在重新编写 Write-Progress 函数以更好地使用我的脚本,为了实现这一点,我将所有参数加入到一个字符串中,然后尝试在命令上使用它,但是它不起作用。

功能

Function Update-Progress {
Param (
    [String] $Activity,
    [Bool] $Completed,
    [String] $CurrentOperation,
    [Int] $ID,
    [Int] $ParentID,
    [Int] $PercentComplete,
    [Int] $SecondsRemaining,
    [Int] $SourceID,
    [String] $Status
)
    If ($htDisplay.WriteProgress.Enable -EQ $True -AND $htDisplay.WriteProgress.StopWatch.Elapsed.TotalMilliseconds -ge 500) {
        $Parameters = New-Object System.Text.StringBuilder
        IF (isNull($Activity)) { Write-Error "Activity is Required" } Else { $Null = $Parameters.Append("-Activity `"$Activity`"")  }
        IF (!(isNull($Completed))) { $Null = $Parameters.Append(" -Completed")  }
        IF (!(isNull($CurrentOperation))) { $Null = $Parameters.Append(" -CurrentOperation `"$CurrentOperation`"")  }
        IF (!(isNull($ID))) { $Null = $Parameters.Append(" -ID `"$ID`"")  }
        IF (!(isNull($ParentID))) { $Null = $Parameters.Append(" -ParentID `"$ParentID`"")  }
        IF (!(isNull($PercentComplete))) { $Null = $Parameters.Append(" -PercentComplete `"$PercentComplete`"")  }
        IF (!(isNull($SecondsRemaining))) { $Null = $Parameters.Append(" -SecondsRemaining `"$SecondsRemaining`"")  }
        IF (!(isNull($SourceID))) { $Null = $Parameters.Append("-SourceID `"$SourceID`"")  }
        IF (!(isNull($Status))) { $Null = $Parameters.Append(" -Status `"$Status`"")  }
        "Write-Progress $Parameters"

        Write-Progress $Parameters

        $htDisplay.WriteProgress.StopWatch.Reset()
        $htDisplay.WriteProgress.StopWatch.Start()
    }
}

命令调用函数

Update-Progress -ID 1 -Activity "Preloading threads" -Status "Starting Job $($htConfig.MultiThread.Jobs.count)"

错误 - 显示进度条

-Activity "Preloading Threads" -ID "1" -Status "Starting Job #"

确切命令的Write-Host显示如下,因此语法正确,只需要弄清楚如何将变量作为所有参数处理,而不仅仅是活动参数。

Write-Progress -Activity "Preloading threads" -ID "1" -Status "Starting Job 2"

【问题讨论】:

    标签: powershell powershell-2.0


    【解决方案1】:

    为了实现这一点,我将所有参数加入到一个字符串中,然后尝试在命令上使用它,但是它不起作用。

    这是一个糟糕的主意 - 使用 splatting$PSBoundParameters 自动变量代替 - 它已经包含您需要的一切:

    Function Update-Progress {
    Param (
        [String] $Activity,
        [Bool] $Completed,
        [String] $CurrentOperation,
        [Int] $ID,
        [Int] $ParentID,
        [Int] $PercentComplete,
        [Int] $SecondsRemaining,
        [Int] $SourceID,
        [String] $Status
    )
        If ($htDisplay.WriteProgress.Enable -EQ $True -AND $htDisplay.WriteProgress.StopWatch.Elapsed.TotalMilliseconds -ge 500) {
    
            Write-Progress @PSBoundParameters
    
            $htDisplay.WriteProgress.StopWatch.Reset()
            $htDisplay.WriteProgress.StopWatch.Start()
        }
    }
    

    对于布尔参数,我可能会选择 Switch 而不是 Bool。您可以使用以下命令从原始命令中获取确切的 Param 块:

    [System.Management.Automation.ProxyCommand]::GetParamBlock($(Get-Command Write-Progress))
    

    最终获得与Write-Process 期望的相对应的输入验证和位置参数:

    Function Update-Progress {
        param(
            [Parameter(Mandatory=$true, Position=0)]
            [string]${Activity},
    
            [Parameter(Position=1)]
            [ValidateNotNullOrEmpty()]
            [string]${Status},
    
            [Parameter(Position=2)]
            [ValidateRange(0, 2147483647)]
            [int]${Id},
    
            [ValidateRange(-1, 100)]
            [int]${PercentComplete},
    
            [int]${SecondsRemaining},
    
            [string]${CurrentOperation},
    
            [ValidateRange(-1, 2147483647)]
            [int]${ParentId},
    
            [switch]${Completed},
    
            [int]${SourceId}
        )
    
        If ($htDisplay.WriteProgress.Enable -EQ $True -AND $htDisplay.WriteProgress.StopWatch.Elapsed.TotalMilliseconds -ge 500) {
    
            Write-Progress @PSBoundParameters
    
            $htDisplay.WriteProgress.StopWatch.Reset()
            $htDisplay.WriteProgress.StopWatch.Start()
        }
    }
    

    【讨论】:

    • 我会牢记这一点,但是,不幸的是,对于这个特定的脚本,我无法使用 powershell v1.0。
    【解决方案2】:

    好的,感谢这里的其他人,我找到了答案。这是内联扩展,我需要使用哈希表变量。

    来源:Inline expansion of powershell variable as cmdlet parameter?

    Function Update-Progress {
    Param (
        [String] $Activity,
        [Bool] $Completed,
        [String] $CurrentOperation,
        [Int] $ID,
        [Int] $ParentID,
        [Int] $PercentComplete,
        [Int] $SecondsRemaining,
        [Int] $SourceID,
        [String] $Status
    )
        If ($htDisplay.WriteProgress.Enable -EQ $True -AND $htDisplay.WriteProgress.StopWatch.Elapsed.TotalMilliseconds -ge 500) {
            IF (isNull($Activity)) { Write-Error "Activity is Required" } Else { $Parameters = @{ Activity=$Activity }  }
            IF (!(isNull($Completed))) { $Parameters += @{ Completed=$Completed }  }
            IF (!(isNull($CurrentOperation))) { $Parameters += @{ CurrentOperation=$CurrentOperation }  }
            IF (!(isNull($ID))) { $Parameters += @{ ID=$ID}  }
            IF (!(isNull($ParentID))) { $Parameters += @{ ParentID=$ParentID }  }
            IF (!(isNull($PercentComplete))) { $Parameters += @{ PercentComplete=$PercentComplete }  }
            IF (!(isNull($SecondsRemaining))) { $Parameters += @{ SecondsRemaining=$SecondsRemaining }  }
            IF (!(isNull($SourceID))) { $Parameters += @{ SourceID=$SourceID }  }
            IF (!(isNull($Status))) { $Parameters += @{ Status=$Status }  }
            Write-Progress @Parameters
            $htDisplay.WriteProgress.StopWatch.Reset()
            $htDisplay.WriteProgress.StopWatch.Start()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 2014-12-05
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多