2017-11-23 15 views
2

ログファイルのパスとして引数を受け取る関数を作成しようとしています。
このパラメータを文字列パスを受信できるようにするか、引数なしで[switch]として使用します。空の値または空でない値を受け取る入力パラメーターを作成する方法

私がカバーする必要がある、私は3つのシナリオを持っていると私は一つのパラメータのみでそれをやってみたかったので、私はそれをしたい理由は次のとおりです。パラメータが渡されていない
1パラメータがで渡され
2空の引数
3.パラメータがここで引数

で渡されたが、私が欲しいものを証明するスクリプトです:

function myFunc(){ 
    param(
     $LogFile = $null 
    ) 

    # 1. PS > myFunc 
    if($LogFile -eq $null){ 
    } 

    # 2. PS > myFunc -LogFile 
    if($LogFile -eq ""){ 
    } 

    # 3. PS > myFunc -LogFile "C:\tmp\log.txt" 
    else{ 
    }  
} 

は、それは、EMを受信することができ、このような入力パラメータを作成することが可能ですptyと空でない値

私はmyFunc -LogFileを実行すると、私はエラーが表示されます。

myFunc : Missing an argument for parameter 'LogFile'. Specify a parameter of type 'System.Object' and try again. 
At line:1 char:8 
+ myFunc -LogFile 
+  ~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [myFunc], ParameterBindingException 
    + FullyQualifiedErrorId : MissingArgument,myFunc 

それは[switch]に設定されていないので、私はmyFunc -LogFile c:\tmp\file.txtを実行することはできませんよりも、私は[switch]を追加する場合、これは次のとおりです。

myFunc : A positional parameter cannot be found that accepts argument 'C:\tmp\file.txt'. 
At line:1 char:1 
+ myFunc -LogFile C:\tmp\file.txt 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [myFunc], ParameterBindingException 
    + FullyQualifiedErrorId : PositionalParameterNotFound,myFunc 

また、[AllowNull()][AllowEmptyString()]を使用しようとしましたが、それでもいくつかのcharが必要です。
詳細については、hereを参照してください。

+0

たぶん私の質問はありませんでした私は受け取ったエラーに関する情報を追加しました。 – E235

+0

あなたがしようとしていることは、ただ1つのパラメータでは可能ではないと思います。私が見る唯一のオプションは、関数内の '$ args'を手作業で処理することです。 – Raziel

答えて

-2
function cookieMonster($ChocolateChipCookie){ 
    if ([string]::IsNullOrEmpty($chocolateChipCookie)){ 
     write-host "Hey wheres my Cookies! " 
    } 
    else { 
     write-host "MMMMM COOKIES! NOM NOM NOM" 
    }  
} 

cookieMonster -ChocolateChipCookie C:\cookiejar\cookie.txt 
+0

これは私が尋ねたものではありません。私はあなたを 'cookieMonster -ChocolateChipCookie'として機能させて動作させません。 – E235

+0

-ChocolateChipCookieの前にコメント記号#を置くと、 "Hey wheres My Cookies!"と表示されず、ファイルの前にコメント記号を置くとエラーになります。 –

+0

しかし、私の質問の1つは、あなたの例では、 'cookieMonster -ChocolateChipCookie'も使用する方法で、エラーを表示します。 – E235

1

スイッチのように動作するパラメータと、文字列入力のようなパラメータを持つことはできません。あなたはスイッチのようにそれを使用しようとする場合、それはあなたがそれに任意の入力に合格しなかったことに文句を言うので、これはです:あなたが探している動作を取得するために

myFunc : Missing an argument for parameter 'LogFile'. Specify a parameter of type 'System.Object' and try again.

一つの方法は、として$LogFileを持っているだろうスイッチを押して、文字列を受け取ることができる2番目のパラメータを持ちます(入力として明示的に宣言する必要はありません)。このパラメータは、呼び出された順番でこのパラメータに渡され、-LogFileに渡されているという印象を与えます。ここではその一例です:

function myFunc{ 
    param(
     [switch]$LogFile, 
     [string]$LogPath = $null 
    ) 

    # 1. PS > myFunc 
    if ($LogFile -eq $false){ 
     "Function used without parameter" 
    } 

    # 2. PS > myFunc -LogFile 
    elseif ($LogFile -eq $true -and -not $LogPath){ 
     "Parameter used like a switch" 
    } 

    # 3. PS > myFunc -LogFile "C:\tmp\log.txt" 
    else{ 
     "Parameter was $LogPath"  
    }  
} 

myfunc 
myfunc -logfile 
myfunc -logfile "C:\tmp\log.txt" 

は、しかし正直に言うと、scernario 2は、ソートの必要はありませんあなたはこのケースでやりたいすべてがデフォルトのパスを持っていると仮定しています。この場合、$ LogPathにparam()ブロックのデフォルトを与えるだけで済みます。また、実際にパラメータで何が起こっているのかについて誤解を招くことはよくありません(get-helpの文法ブロックでは関係なく公開されます)。

function cookieMonster{ 
    param(

     [switch] $ChocolateChipCookie, 
     [string] $Crumbs = $null 
    ) 

# The function without parameters 
if($ChocolateChipCookie -eq $false){ 
    write-host "no cookies;(" 
} 

# The parameter is not passed 
elseif ($ChocolateChipCookie -eq $true -and -not $Crumbs) { 
    Write-Host "Aw just crumbs!" 
} 
# The parameter is passed with argument 
else { 
    write-host "MMMMM COOKIES! NOM NOM NOM" 
} 


} 

cookieMonster -ChocolateChipCookie C:\cookiejar\cookie.txt 

$ ChocolateChipCookieがスイッチパラメータとして定義されています

+1

私は2つの異なる名前の使用を避けたかったのですが、私はあなたの答えに行くかもしれません。私はまだ誰か他の創造的なアイデアがあるかどうかを見たいと思う。 – E235

+0

私は '[Parameter(DontShow)]'を '$ LogPath'変数に追加します。これは、ユーザにこのオプションを見せたくないからです。その他のオプションについては、こちらを参照してください。https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.parameterattribute.dontshow?view=powershellsdk-1.1.0 – E235

-2

この回答は、上記伝説のマークWraggに触発されています。 switchパラメータに与えられた値は、$ crumbsという文字列パラメータとして作成されます。

ifブロックは、関数をスイッチなしで呼び出してメッセージを書き込むかどうかをチェックします。

elseifブロックは、値を持たないスイッチで関数が呼び出されたかどうかをチェックします。

上記の条件に当てはまらない場合、elseブロックはメッセージを書き込みます。

+1

あなたは@マーク・ラグの答えをコピーしました。変数をプログラム的ではないものに変更します – E235

+0

経験豊富な人々のコードから学習することは何も問題ありません。これで私のスクリプトはあなたが尋ねたものすべてをやりますそして私はコメントと説明を追加しました。 –

1

それが存在だ場合、ちょうどそれが存在する場合、次の引数の値とそれを埋める、文字列値に入力します変換し、スイッチの引数として$LogFileを受け入れる:

param(
     [switch] 
     $LogFile 
    ) 

if($LogFile) 
{ 
    #We neeed to change the variable type, so remove it 
    Remove-Variable -Name "LogFile" 
    #The remaining arguments are placed in $args array. 
    if($args.Count -gt 0) 
    { 

     $LogFile = [String]$args[0] 
    } 
    else { 
     $LogFile = [String]"" 
    } 
} 
# 1. PS > myFunc 
else { 
    "# 1. PS > myFunc " 
} 
# 2. PS > myFunc -LogFile 
if($LogFile -eq ""){ 
     "LogFile is empty" 
} 

# 3. PS > myFunc -LogFile "C:\tmp\log.txt" 
elseif ($LogFile -is [String]){ 
    "logFile is $logFile" 
}  
+0

これは私が考えていたものです。 opsユースケースはまだ奇妙に見えますが、これは要件を満たしています。 – Matt

関連する問題