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


90

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

私がPowerShellシェルの中にいる場合、代わりにcmd.exe、それは機能します(もちろん)。しかし、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>

回答:


34

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

-ファイル

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

すなわち

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

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


1
これでも、操作が必要なもの(「入力したいxuxu p1 p2 p3 p4」)には役立ちません。
thdoan 2018年

19

PowerShellのドキュメントを調べた後、この問題に関するいくつかの有用な情報を発見しました。ファイルの先頭でを使用した$args場合は使用できませんparam(...)。代わりに、を使用する必要があります$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

これは、OPがpowershell.exeまたはpwshでコマンドラインを開始することを考慮していません。OPがそれを行うと、動作が変わります。
エリックハンセン

1
@EricHansen意味がわかりませんが、どちらの方法でも同じ結果が得られます: `Powershell> powershell.exe。\ ParamTest.ps1 val1 val2 val3 val4 Num Args:4 $ p1 = val1 $ p2 = val2 $ p3 = val3 $ P4 = val4 `
ランドールBorck

@RandallBrock引数の動作が変わります。私がCMD /バッチにいて、のようなことをした場合pwsh .\ParamTest.ps1 -arg1 val1 -listOfArgs val2 val3 val4、それは本当に好きではありません。一方、PowerShellを使用している場合は.\ParamTest.ps1 -arg1 val1 -listOfArgs val2 val3 val4、期待どおりに機能します。これが「セキュリティ上の理由」により機能することを意図していると聞いています。
エリックハンセン

@EricHansenバージョンのものかしら。私にとっては、pwsh起動6.2.0はなく、記載されている同じ結果を生成どちらの進水たpowershell.exe 5.1.17134.858、:Powershell>pwsh .\ParamTest.ps1 val1 val2 val3 val4利回り:Num Args: 4 $p1=val1 $p2=val2 $p3=val3 $p4=val4
ランドールBorck

1
@Timo正確に何をしているのかわかりませんparamが、言語構造ですが、ファイルの最初のものでなければなりません。その前に変数などを宣言しましたか?詳細:docs.microsoft.com/en-us/powershell/module/...
ランドールBorck

18

さて、最初にこれはPowerShellの基本的なセキュリティ機能を破っています。その理解の下で、これがあなたがそれをすることができる方法です:

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

-NoProfileプロファイルの機能によっては、そこにも引数を入れたい場合があります。


4
重要なのは、powershell.exeにパラメーターを渡すステップ6にあると思います。ダニエルは、PS1ファイルをPowerShellに関連付けましたが、追加の%1%*仕様がないと引数を渡さないと言います。また、-FileパラメーターはV1では使用できないことに注意してください。これはV2の新機能です。
キース・ヒル

私がそれを忘れていた-fileパラメータに関する良いキャッチ。
EBGreen 2009

あなたの提案を試す前に、V2をインストールする必要があります。ありがとう。これが基本的なセキュリティ機能を破っていると言うとき、「これ」とはどういう意味ですか?.com / .bat / .exeファイルであるかのようにCmd.exeからPowerShellスクリプトを呼び出しますか?スクリプトにパラメータを渡しますか?
ダニエル 'ダン'グリフィス

1
申し訳ありませんが、もっと明確にすべきでした。powershell.exeを明示的に呼び出さずにスクリプトを呼び出す。個人的に重要なセキュリティ機能だと言っているのではなく、隠すことによるセキュリティであり、とにかく私がいつも好きというわけではありません。
EBGreen 2009

6
EBGreenのコメントに追加するために、PowerShellが回避しようとしている基本的なセキュリティの問題は、電子メールに添付されたPS1ファイルをダブルクリックしてスクリプトを実行することです。そのため、PS1ファイルはデフォルトでエディターにのみ関連付けられています。マイクロソフトは本当にILOVEYOUウイルス例えば「LOVE-LETTER-FOR-YOU.TXT.ps1」のPowerShellのバージョンを望んでいない
キース・ヒル

11

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

[string]$para1
[string]$param2

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


6

たぶん、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

トリプルクォートを表示するための+1。それは私をしばらく立ち往生させました。
DeanOC 2014

1

見た目どおり「xuxup1p2p3p4」が表示されない場合があります。ただし、PowerShellを使用していて、

PS > set-executionpolicy Unrestricted -scope currentuser

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

./xuxu p1 p2 p3 p4

または

.\xuxu p1 p2 p3 p4

または

./xuxu.ps1 p1 p2 p3 p4

これにより、PowerShellが少し快適になることを願っています。


0

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


これには、管理者としてcmdプロンプトを実行する必要があることに注意してください。また、Windows 10バージョン1903(18362.778)で実際に機能させるのに苦労しています。すべてのコマンドは正常に実行されますが、引数はまだ渡されません。.batファイルでラップするのが最も移植性の高いソリューションだと思います。
David Airapetyan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.