web-dev-qa-db-ja.com

コマンドラインからPowershellスクリプトを実行し、パラメータとしてディレクトリを渡す方法

私のPowershellスクリプト、Foo.ps1:

Function Foo($directory)
{
    echo $directory
}

if ($args.Length -eq 0)
{
    echo "Usage: Foo <directory>"
}
else
{
    Foo($args[0])
}

Windowsコンソールから:

powershell -command .\Foo.ps1

結果:「 '。\ Foo.ps1'という用語は、コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されません。名前のスペルを確認するか、パスが含まれている場合は、パスを確認します正しいので再試行してください。」

これは、Foo.ps1がPowershellを呼び出している現在のディレクトリにあるにもかかわらずです。次に、スクリプトファイルへのフルパスを指定して呼び出します。このパスにはスペースが含まれているため、何らかの方法で引用する必要があります。また、1つ以上のスペースを含むファイル名でもある引数をスクリプトに渡す必要があります。私が何を試みても、私はそれを動作させることができません。これはこれまでの私の最高の推測です:

powershell -command "'C:\Dummy Directory 1\Foo.ps1' 'C:\Dummy Directory 2\File.txt'"

これにより、式またはステートメントに「予期しないトークン 'C:\ Dummy Directory 2\File.txt'というエラーが表示されます。行:1文字:136」。

編集:理由を見つけました

powershell -command .\Foo.ps1

動作しませんでした。これは、Microsoft.PowerShell_profile.ps1ファイルに

cd C:\

そのため、powershellが起動するとすぐにディレクトリが変更されました。

49
Polyfun

これを試して:

powershell "C:\Dummy Directory 1\Foo.ps1 'C:\Dummy Directory 2\File.txt'"
38
CB.

コマンドではなくスクリプトファイルを呼び出しているため、-fileを使用する必要があります。例:

powershell -executionPolicy bypass -noexit -file "c:\temp\test.ps1" "c:\test with space"

pS V2用

powershell.exe -noexit &'c:\my scripts\test.ps1'

(このtechnetページの下部を確認してください http://technet.Microsoft.com/en-us/library/ee176949.aspx

37
Loïc MICHEL

フラグ-Commandを使用すると、PowerShellプロンプトのコマンドであるかのようにpowershell行全体を実行できます。

powershell -Command "& '<PATH_TO_PS1_FILE>' '<ARG_1>' '<ARG_2>' ... '<ARG_N>'"

これにより、Visual Studioのビルド後イベントおよびビルド前イベントでPowerShellコマンドを実行する際の問題が解決しました。

17

コードを次のように変更します:

Function Foo($directory)
    {
        echo $directory
    }

    if ($args.Length -eq 0)
    {
        echo "Usage: Foo <directory>"
    }
    else
    {
        Foo([string[]]$args)
    }

そして、それを次のように呼び出します:

powershell -ExecutionPolicy RemoteSigned -File "c:\ foo.ps1" "c:\ Documents and Settings" "c:\ test"

2
Prasoon Dwivedi

Ps1ファイルの先頭にパラメーターのデクリレーションを追加します

test.ps1

param(
  # Our preferred encoding
  [parameter(Mandatory=$false)]
  [ValidateSet("UTF8","Unicode","UTF7","ASCII","UTF32","BigEndianUnicode")]
  [string]$Encoding = "UTF8"
)

write ("Encoding : {0}" -f $Encoding)

結果

C:\temp> .\test.ps1 -Encoding ASCII
Encoding : ASCII
1
Hyundong Hwang