Как лучше всего вызывать одну и ту же функцию несколько раз в Powershell с разными входными данными? - PullRequest
1 голос
/ 26 мая 2020

Я sh вызываю эту Set-FixedVariable несколько раз с разными входными данными, но мне удается выполнить ее только один раз, когда я вызываю DeclareFixedVariables, почему это так?

Function DeclareFixedVariables
{
    try
    {
        Set-FixedVariable -name 'fixModelName'-value $ModelName -size 30
        Set-FixedVariable -name 'fixMasterSetId' -value $ReturnMessage.MasterSetID -size 36
        Set-FixedVariable -name 'fixModelversionId'-value $ModelversionID -size 36
        Set-FixedVariable -name 'fixStartDateStr' -value $StartDateStr -size 23
        Set-FixedVariable -name 'fixCreateDate' -value $CreateDateStr -size 23
        Set-FixedVariable -name 'fixModelChangeDate' -value $ModelChangeDate -size 23
        Set-FixedVariable -name 'fixModelOwner' -value $ModelProperties.UserId -size 6
        Set-FixedVariable -name 'fixChangeId' -value $ModelProperties.ChangeId -size 10
        Set-FixedVariable -name 'fixChangeUser' -value $ModelProperties.UserId -size 10
        Set-FixedVariable -name 'fixAfBolag' -value $afBolag -size 2
        Set-FixedVariable -name 'fixThBolag' -value $thBolag -size 2
    }catch
    {
        Write-Log -Message "***Invoking Set-FixedVariable failed***" -Path $LogFile -Level Info
    }
}

function Set-FixedVariable 
{

    param( [parameter(mandatory)][string]$name,
           [parameter(mandatory)][string]$value,
           [parameter(mandatory)][int]$size
    )

    $sb = [System.Text.Stringbuilder]::new( ' ' * $size )
    [void]$sb.Insert(0, $value)

    Set-Variable -Name $name -Value $sb.ToString().Substring(0, $size) -Scope Script -Force

    return $value

}

1 Ответ

3 голосов
/ 26 мая 2020

Прямо сейчас единственная реальная проблема, которую я вижу, заключается в том, что все ваши переменные установлены с использованием Set-FixedVariable только с одним блоком try/catch, что означает, что PowerShell обработает каждый из них построчно, а затем остановится, когда первый терпит неудачу.

Было бы лучше справиться с этим с помощью forEach l oop, вот так.

Function DeclareFixedVariables
{

    $VariableSettings = @(
        @{Name='fixModelName';Value=$ModelName;Size=30},
        @{Name='fixMasterSetId';Value=$ReturnMessage.MasterSetID;Size=36},
        @{Name='fixModelversionId';Value=$ModelversionID;Size=23}
    )

    forEach($variableSetting in $VariableSettings){
        try{
            Set-FixedVariable @variableSetting
        }
        catch{
            Write-Log -Message "***Invoking Set-FixedVariable failed for $($VariableSetting.Name) with value $($VariableSetting.Value)***" -Path $LogFile -Level Info
        }
    }

}

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

Следующий шаг: вы можете дважды проверить свои предположения относительно того, что Set-FixedVariable предназначен . Это очень непонятно, зачем иметь массив с количеством пробелов перед значением?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...