0

myscript.ps1

Param(
    [Parameter(Mandatory=$true,Position=1)]
    [string]$computerName
)

echo "arg0: " $computerName

CMD.exe

C:\> myscript.ps1 -computerName hey

出力:

    コマンド パイプライン位置 1 のコマンドレット myscript.ps1
    次のパラメーターの値を指定します。
    コンピューター名: ddd
    arg0:
    ddd

私は単に CMD で Powershell パラメーターを操作しようとしていますが、スクリプトを取得できないようです。スクリプトの前に を付けるように言っているサイトを見かけます.\が、それは役に立ちません。Powershell がパラメーターを読み取っているかどうかを確認するために必須の行を追加しましたが、明らかにそうではありません。パラメータcomputerNameは明らかに「ねえ」という言葉です。ブロックは、スクリプトのParam最初にあるものです。Powershell は parameter を認識しているように見えますcomputerNameが、どのようにコマンドを入力しても、実際にパラメーターを入力しているとは決して考えません。

私の構文の何が問題なのですか?

4

3 に答える 3

2

デフォルトでは、Powershell は現在のディレクトリでたまたま見つけたスクリプトを実行しません。これは Microsoft がセキュリティ機能として意図したものであり、UNIX シェルで見られる動作を模倣していると思います。

Powershell は、検索パスで見つかったスクリプトを実行します。検索パスは に保存され$env:pathます。

検索パス上の別のディレクトリに「myscript.ps1」という名前のスクリプトがあると思われます。

私は以前にこれが起こったことがあります。私が見た症状は、パラメーター リストが私が定義したものと異なっているように見えることでした。各スクリプトには異なるパラメーター リストがあったため、他のスクリプト用のパラメーター リストを渡すと、スクリプトが爆撃されました。パラメータの位置に依存しないのが私の習慣なので、この問題は簡単に見つかりました。

スクリプト ".\myscript.ps1" に ".\" を追加すると、シェルは現在のディレクトリにある .ps1 ファイルを使用するようになります。テストとして、実行しようとしているファイルへのフル パスを指定するか (パスにスペースが含まれている場合は、必ずパスを「引用符」で囲んでください)、完全にクレイジーな名前に変更します。他のファイル (「crazyfishpants.ps1」など) によって複製され、シェルがまだファイルを見つけるかどうかを確認します。

スクリプト ファイル ("Get-Foo.ps1") と同じ名前のモジュールまたはプロファイルから読み込まれる関数 ("Get-Foo") がある場合、同様の問題が発生する可能性があります。意図したものとは異なるものを実行してしまう可能性があります。

于 2012-09-26T13:48:01.063 に答える
1

位置の値は 0 から始まる必要があります (最初のパラメーターは 0)。とはいえ、PowerShell 2.0 または 3.0 で表示されている内容を複製することはできません。

于 2012-09-26T05:28:29.463 に答える
0

皆様、非常に有益な回答をありがとうございました。私の質問は、送信する前に少し編集されたようです。テキストを見ると、このコマンドを Powershell で直接入力していると思われるようになります。

私は実際にCMDでスクリプトのコマンドを実行していました.Powershellスクリプトにパラメータを渡していなかった理由を完全に説明しています. 私の質問にゴーサインを出した人は、私がタイプミスをしたと思って C:\> を PS> に変更したのでしょう。

スクリプトを CMD から直接実行できれば、CMD のコマンド ラインでパラメーターを送信できると思っていましたが、どうやらそうではないようです。Powershell でスクリプトを実行すると、実際に問題なく動作することがわかりました。

私の最終的な目標は、ユーザーが CMD から Powershell スクリプトを実行できるようにすることでした。パラメータを受け入れるバッチ ファイルを作成し、powershell を起動してそれらのパラメータを PS スクリプトに送信できるようです。したがって、バッチ ファイルでは、次のようにする必要があります。

powershell -File C:\myscript.ps -computerName %1

この謎は、このサイトでおそらく 100 回以上解決されました。混乱を招いて申し訳ありません。回答ありがとうございます。

于 2012-09-26T22:26:38.223 に答える