2016-03-06 2 views
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 точной команды показывает следующее поэтому правильность синтаксиса , просто нужно выяснить, как обрабатывать переменную, поскольку все параметры inste объявление только параметра активности.

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

ответ

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() 
    } 
} 
3

для достижения этой цели я присоединиться все аргументы в строку, а затем пытается использовать его в команде, однако он не работает.

Это ужасная идея - использовать 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() 
    } 
} 
+0

Я Защиту держать это в виду, однако я, к сожалению, застрял, используя powershell v1.0 для этого конкретного скрипта. – user1451070