2017-02-02 6 views
0

パラメータを持つスクリプトがあります。スクリプトのデバッグを容易にするために、私はすべての変数をリストするためにネット上にある小さな関数を作成します。これを行うには、既存の変数をすべてスクリプトの先頭に置いてから、パラメータを取得する前と後で記録された変数を比較する関数を作成します。パラメータがパラメータより大きい場合、パラメータを宣言することはできません

とその関数をparam PowerShellでは、既定値を設定するすべてのパラメータに対して次のエラーが表示されます。この回避策はとにかくありますか? …バグ?それがバグでなければ、どうしてこんなふうに振る舞うのですか?私はその点を見ない。

割り当て式が無効です。代入演算子への入力は、変数またはプロパティのような代入を受け入れることができるオブジェクトでなければなりません( など)。

# Array and function to debug script variable content 
$AutomaticVariables = Get-Variable 

function check_variables { 
    Compare-Object (Get-Variable) $AutomaticVariables -Property Name -PassThru | 
    Where -Property Name -ne "AutomaticVariables" 
} 

param(
    [String]$hostname, 
    [String]$jobdesc, 
    [String]$type = "standard", 
    [String]$repo, 
    [String]$ocred, 
    [String]$site, 
    [String]$cred = "SRC-$($site)-adm", 
    [String]$sitetype, 
    [String]$room, 
    [String]$chsite = "chub" 
) 

# TEST - Display variables 
check_variables 
+0

は、私が言うべきことをたとえ私は単純な変数宣言をparamの前にx = 1と同じように愚かにする。振る舞いは同じである。つまり、Get-Variableや関数には関係しません。 paramの前のものはすべて同じ結果を返します。 –

+2

これはバグではありません。パーサを書く人の人生を楽にするために、言語がどのように設計されているかです。 –

+0

どのようにパラメータの前に設定したい変数を扱うのですか? Get-Variable Insideパラメータを追加しようとしましたが、他のすべてのパラメータが含まれています。それは順番に設定されていないようです。 –

答えて

0

それはバグではありません。 paramセクションでは、スクリプトの入力パラメータが定義されているため、最初のステートメント(関数と同じ)が必要です。 paramブロックの前に何も実行する必要はありません。

check_variablesで達成したいことを説明してください(その内容ではありません)。私たちはおそらくそれを正しく行う方法を示すことができます。

+0

私の目的は、変数内容を表示するだけです。 Get-Variableと同様ですが、自動変数は表示されません –

2

コメントで述べたように、あなたが呼び出しスコープに除外したい変数を収集する必要があります

私は最後に追加した$DebugFuncパラメータに気づく、(同様のスクリプトかもしれない)関数を定義:今

function Do-Stuff 
{ 
    param(
     [String]$hostname, 
     [String]$jobdesc, 
     [String]$type = "standard", 
     [String]$repo, 
     [String]$ocred, 
     [String]$site, 
     [String]$cred = "SRC-$($site)-adm", 
     [String]$sitetype, 
     [String]$room, 
     [String]$chsite = "chub", 
     [scriptblock]$DebugFunc 
    ) 

    if($PSBoundParameters.ContainsKey('DebugFunc')){ 
     . $DebugFunc 
    } 
} 

、変数を収集し、あなたの関数を定義し、その後、Do-Stuffに注入:

# Array and function to debug script variable content 
$AutomaticVariables = Get-Variable 
function check_variables { 
    Compare-Object (Get-Variable) $AutomaticVariables -Property Name -PassThru | Where -Property Name -ne "AutomaticVariables" 
} 

Do-Stuff -DebugFunc $Function:check_variables 
関連する問題