2009-05-31 16 views
19

何かとてもシンプルなので、私にとってはうまくいきません。私は単一のパラメータを受け入れるコマンドレットを得ました。 Windowsのバッチファイル内でコマンドレットを呼び出そうとしています。バッチファイルには含まれていますWindowsバッチファイルからpowershellコマンドレットを呼び出す

cd %SystemRoot%\system32\WindowsPowerShell\v1.0 
powershell Set-ExecutionPolicy Unrestricted 
powershell 'C:\convert-utf8-to-utf16.ps1 C:\test.txt' 
powershell Set-ExecutionPolicy Restricted 
pause 

マイPS1ファイルは、再び特別何もしていない:

function convert-utf8-to-utf16 { 
    $tempfile = "C:\temp.txt" 
    set-ExecutionPolicy Unrestricted 
    get-content -Path $args[0] -encoding utf8 | out-file $tempfile -encoding Unicode 
    set-ExecutionPolicy Restricted 
    } 

私はbatファイルを実行すると、それだけで完了(エラーメッセージなし)に実行され、それが表示されません。 temp.txtファイルを作成します。

powershellコマンドファイルは、PSコマンドプロンプトでは実行できますが、cmdでは実行できません。

誰かが間違っている可能性のあるアイディアを持っていますか?

おかげ

+0

Johannes:cmd.exeはWin32アプリケーションです(ただし、多くの人はまだDOS command.comと考えています)。 [質問は編集する必要があります] – grawity

+0

完全なソースコードを含む最終解決策はありますか? – Kiquenet

答えて

0

は、代わりにこの構文を試してみてください:

cd %SystemRoot%\system32\WindowsPowerShell\v1.0 
powershell {Set-ExecutionPolicy Unrestricted} 
powershell "& C:\convert-utf8-to-utf16.ps1 C:\test.txt" 
powershell {Set-ExecutionPolicy Restricted} 
pause 
1

を私はこの作業を得ました... PS1ファイルは、関数にラップする必要はありません。ちょうどこの宣言は大丈夫です。

$tempfile = "C:\temp.txt" 
get-content -Path $args[0] -encoding utf8 | out-file $tempfile -encoding unicode  

とbatファイルは好きそれを呼び出す:

cd %SystemRoot%\system32\WindowsPowerShell\v1.0 
powershell Set-ExecutionPolicy Unrestricted 
powershell "& 'C:\convert-utf8-to-utf16.ps1 C:\test.txt' 'C:\test.txt'" 
powershell Set-ExecutionPolicy Restricted 
pause 
+0

あなたが遭遇したのは、スクリプトが関数を定義していて実行していないということです。あなたは、スクリプトの終わりに関数を呼び出すこともできますし、関数にコードをラップすることもできません。 – JasonMArcher

5

問題がPS1ファイルである - あなたは、関数の宣言が、あなたはそれを呼び出すことはありません。 私はこれを次のように変更します:

param($path) 
function convert-utf8-to-utf16 { 
$tempfile = "C:\temp.txt" 
set-ExecutionPolicy Unrestricted 
get-content -Path $args[0] -encoding utf8 | out-file $tempfile -encoding Unicode 
set-ExecutionPolicy Restricted 
} 

convert-utf8-to-utf16 $path 

それは動作します。しかし、それが必要とされていない、あなたは、単に関数の宣言をOMMIT、スクリプト自体に体を動かすことができます。コマンドプロンプトから

param($path) 
$tempfile = "C:\temp.txt" 
set-ExecutionPolicy Unrestricted 
get-content -Path $path -encoding utf8 | out-file $tempfile -encoding Unicode 
set-ExecutionPolicy Restricted 
3
# Test-Args.ps1 
param($first, $second) 
write-host $first 
write-host $second 

コール:

PowerShell.exe -NoProfile -Command "& {./Test-Args.ps1 'C:\Folder A\One' 'C:\Folder B\Two'}" 

混乱何があればということですスクリプトがスペースを含むフォルダパスにある場合、PowerShellはスクリプト名を引用符で認識しません。

PowerShell.exe -NoProfile -Command "& {'C:\Folder X\Test-Args.ps1' 'C:\Folder 
A\One' 'C:\Folder B\Two'}" 

しかし、あなたのような何か使用していることを周りに取得することができます:あなたの.PS1ファイル名にスペースを使用しないでください

PowerShell.exe -NoProfile -Command "& {set-location 'C:\Folder X';./Test-Args.ps1 'C:\Folder 
A\One' 'C:\Folder B\Two'}" 

を、またはあなたが幸運を離れるです。 PowerShellのバージョン2以降で

22

私だけdragging and dropping files to a Powershell scriptを処理する方法を見つけ出すことができれば、あなたは今、そう...

powershell -ExecutionPolicy RemoteSigned -File "C:\Path\Script.ps1" "Parameter with spaces" Parameter2 

のようにPowerShellスクリプトを実行することができます。

+0

ありがとう、これは私の頭痛を解決し、powershellをNSISに変換するのを避けました – CharlesB

7

私はバッチファイルからPowerShellスクリプトを呼び出す理由と、それを行う方法を説明しますin my blog post here

これは、あなたが探しているものは基本的である:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\convert-utf8-to-utf16.ps1' 'C:\test.txt'" 

そして、あなたが管理者として、あなたのPowerShellスクリプトを実行する必要がある場合、この使用:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\convert-utf8-to-utf16.ps1"" ""C:\test.txt""' -Verb RunAs}" 

ではなくハードコーディング全体をPowerShellスクリプトへのパスは、私のブログ記事で説明しているように、バッチファイルとPowerShellスクリプトファイルを同じディレクトリに置くことをお勧めします。

関連する問題