none
ps1ファイルのargs[0]について

    質問

  • 抽象的な質問で申し訳ありませんが、何かわかることがあれば

    教えていただきたいです。

    ps1ファイルを作成し、そこにpowershellのコマンドを記述して使用しています。

    コマンドの中身の変数(Where-Object)が変更がよくあるのでそこをargs[0]で記述して

    いるのですがうまく動きません。

    デバッグの為にargs[0]の中をOut-File a.csvに出力してみても正しく記述されています。

    ps1ファイルの中に直打ちするとうまく動きます。

    基本的なコードの書き間違いの可能性もありますが、どうもうまくいかないので、何か特殊

    なことがあるのか教えていただきたいです。よろしくお願いします。

    win7

    version 2

    2017年3月7日 2:27

回答

  • $argsは自動変数なので、スクリプトブロック({}内に記述するコード)が生成されるたびにリセットされます。

    Where-ObjectやForEach-Objectコマンドレットのパラメータとして指定する、スクリプトブロックでも同様です。

    スクリプトブロック内で$argsを参照する際には、ps1ファイル直下の$argsの値ではなく、スクリプトブロックで生成された新たな$argsの値が利用されます。

    ps1ファイル直下の$argsの値を、スクリプトブロック内でも利用したい場合は、以下のように適当な変数に格納しておけばOKです。

    $arg = $args[0]
    1..10 | Where-Object{$_ % $arg -eq 0}


    2017年3月7日 2:50
    モデレータ

すべての返信

  • $argsは自動変数なので、スクリプトブロック({}内に記述するコード)が生成されるたびにリセットされます。

    Where-ObjectやForEach-Objectコマンドレットのパラメータとして指定する、スクリプトブロックでも同様です。

    スクリプトブロック内で$argsを参照する際には、ps1ファイル直下の$argsの値ではなく、スクリプトブロックで生成された新たな$argsの値が利用されます。

    ps1ファイル直下の$argsの値を、スクリプトブロック内でも利用したい場合は、以下のように適当な変数に格納しておけばOKです。

    $arg = $args[0]
    1..10 | Where-Object{$_ % $arg -eq 0}


    2017年3月7日 2:50
    モデレータ
  • イメージしづらいので、具体的なコードをお願いできますか?

    // ひょっとして、$args[0] の $ が抜けてる?

    2017年3月7日 2:52
  • お世話になります。

    2017/02/23の箇所を下記のように直打ちするとうまく動きますが、

    "$($args[0])"で書き換えると動かなくなっていました。

    Where-Object の前後スクリプトブロック{}多数あります。

    Where-Object {$_.納品日  -eq ”2017/02/23”}

    以下のようにするとうまく動きました。

    $arg = "$($args[0])"

     Where-Object {$_.納品日  -eq $arg }

    スクリプトブロック、自動変数等の基礎を知らず

    いきなりコードを組んでいたので苦労しました。

    牟田口大介様、Hongliang様

    ありがとうございました。

    2017年3月7日 5:16