私の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が起動するとすぐにディレクトリが変更されました。
これを試して:
powershell "C:\Dummy Directory 1\Foo.ps1 'C:\Dummy Directory 2\File.txt'"
コマンドではなくスクリプトファイルを呼び出しているため、-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 )
フラグ-Command
を使用すると、PowerShellプロンプトのコマンドであるかのようにpowershell行全体を実行できます。
powershell -Command "& '<PATH_TO_PS1_FILE>' '<ARG_1>' '<ARG_2>' ... '<ARG_N>'"
これにより、Visual Studioのビルド後イベントおよびビルド前イベントでPowerShellコマンドを実行する際の問題が解決しました。
コードを次のように変更します:
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"
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