存储参数和变量并使用命令

时间:2016-03-06 12:29:48

标签: powershell powershell-v2.0

我正在重写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"

2 个答案:

答案 0 :(得分:3)

  

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

这是一个糟糕的主意 - 使用splatting代替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() } } 期望的对应的输入验证和位置参数:

select regexp_replace(the_column, '(st)|(nd)|(rd)', '', 'g') as new_value
from the_table;

答案 1 :(得分:0)

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

来源: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()
    }
}