web-dev-qa-db-ja.com

PowerShell ps1ファイルにコマンドライン引数を渡す方法

何年もの間、私はcmd/DOS/Windowsシェルを使用し、コマンドライン引数をバッチファイルに渡しました。たとえば、ファイルzuzu.batがあり、その中に%1%2などにアクセスします。今度は、PowerShellスクリプトwhen I am in a Cmd.exe Shell。スクリプトxuxu.ps1があります(そして、PS1をPATHEXT変数に追加し、PS1ファイルをPowerShellに関連付けました)。しかし、私が何をしても、$args変数から何も取得できないようです。長さは常に0です。

cmd.exeの代わりにPowerShellシェルを使用している場合、(もちろん)動作します。しかし、PowerShell環境でフルタイムで生活するのに十分なほど快適ではありません。 powershell.exe -command xuxu.ps1 p1 p2 p3 p4と入力したくありません。 xuxu p1 p2 p3 p4と入力します。

これは可能ですか?もし可能なら、どのように?

私が働けないサンプルは、foo.ps1という簡単なものです。

Write-Host "Num Args:" $args.Length;
foreach ($arg in $args) {
    Write-Host "Arg: $arg";
}

結果は常に次のようになります。

C:\temp> foo
Num Args: 0
C:\temp> foo a b c d
Num Args: 0
c:\temp>

この記事 役立ちます。特に、このセクション:

-ファイル

ローカルスコープ(「ドットソース」)で指定されたスクリプトを実行し、スクリプトが作成する関数と変数が現在のセッションで利用できるようにします。スクリプトファイルのパスとパラメーターを入力します。 Fileは、コマンドの最後のパラメーターである必要があります。Fileパラメーター名の後に入力されたすべての文字は、スクリプトファイルパスとそれに続くスクリプトパラメーターとして解釈されるためです。

つまり.

powershell.exe -File "C:\myfile.ps1" arg1 arg2 arg3

ファイルmyfile.ps1を実行することを意味し、arg1 arg2&arg3はPowerShellスクリプトのパラメーターです。

31
Arj

OK、最初にこれはPowerShellの基本的なセキュリティ機能を壊しています。それを理解した上で、次のようにします。

  1. Windows Explorer ウィンドウを開きます
  2. メニューツール-> フォルダオプション->タブファイルタイプ
  3. PS1ファイルタイプを見つけて、詳細ボタンをクリックします
  4. [新規]ボタンをクリックします
  5. アクションの場合:Open
  6. アプリケーションの場合: "C:\ WINNT\system32\WindowsPowerShell\v1.0\powershell.exe" "-file" "%1"%*

あなたのプロファイルが何をするかに応じて、-NoProfile引数もそこに入れたいかもしれません。

18
EBGreen

PowerShellドキュメントを掘り下げた後、この問題に関する有用な情報を発見しました。ファイルの先頭でparam(...)を使用した場合、$argsは使用できません。代わりに、$PSBoundParametersを使用する必要があります。コードをPowerShellスクリプトにコピーして貼り付けましたが、PowerShellバージョン2で期待どおりに機能しました(この問題に遭遇したときにどのバージョンを使用していたのかわかりません)。

$PSBoundParametersを使用している場合(スクリプトの先頭でparam(...)を使用している場合にのみ機能します)、配列ではなく、ハッシュテーブルなので、参照する必要がありますキー/値のペアを使用します。

param($p1, $p2, $p3, $p4)
$Script:args=""
write-Host "Num Args: " $PSBoundParameters.Keys.Count
foreach ($key in $PSBoundParameters.keys) {
    $Script:args+= "`$$key=" + $PSBoundParameters["$key"] + "  "
}
write-Host $Script:args

で呼び出されたとき...

PS> ./foo.ps1 a b c d

結果は...

Num Args:  4
$p1=a  $p2=b  $p3=c  $p4=d
17
Randall Borck

Paramのように、ファイルでパラメーターを宣言できます。

[string]$para1
[string]$param2

そして、.\temp.ps1 para1 para2....para10などのようにPowerShellファイルを呼び出します。

10
V.B

PowerShell呼び出しを次のように.batファイルにラップすることができます。

rem ps.bat
@echo off
powershell.exe -command "%*"

このファイルをPATH内のフォルダーの下に配置すると、次のようなPowerShellスクリプトを呼び出すことができます。

ps foo 1 2 3

ただし、引用は少し複雑になります。

ps write-Host """hello from cmd!""" -foregroundcolor green
6
guillermooo

「xuxu p1 p2 p3 p4」が表示されない場合があります。ただし、PowerShellで設定する場合

PS > set-executionpolicy Unrestricted -scope currentuser

これらのスクリプトは次のように実行できます。

./xuxu p1 p2 p3 p4

または

.\xuxu p1 p2 p3 p4

または

./xuxu.ps1 p1 p2 p3 p4

PowerShellを少しでも使いやすくなることを願っています。

1
Atiq Rahman

cmdからps1スクリプトを呼び出し、次のようなスクリプトを呼び出さずに引数を渡す場合

powershell.exe script.ps1 -c test
script -c test ( wont work )

次のことができます

setx PATHEXT "%PATHEXT%;.PS1" /m
assoc .ps1=Microsoft.PowerShellScript.1
ftype Microsoft.PowerShellScript.1=powershell.exe "%1" %*

これは、powershell.exeがパスにあることを前提としています

https://docs.Microsoft.com/en-us/windows-server/administration/windows-commands/ftype

0
ta32