何年もの間、私は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スクリプトのパラメーターです。
OK、最初にこれはPowerShellの基本的なセキュリティ機能を壊しています。それを理解した上で、次のようにします。
あなたのプロファイルが何をするかに応じて、-NoProfile
引数もそこに入れたいかもしれません。
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
Paramのように、ファイルでパラメーターを宣言できます。
[string]$para1
[string]$param2
そして、.\temp.ps1 para1 para2....para10
などのようにPowerShellファイルを呼び出します。
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
「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を少しでも使いやすくなることを願っています。
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