web-dev-qa-db-ja.com

WindowsバッチファイルからのPowerShellコマンドレットの呼び出し

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

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ファイルが作成されないようです。

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

誰かが何か間違っているかもしれないアイデアを持っていますか?

20
Th3Fix3r

Powershellバージョン2以降では、Powershellスクリプトを次のように実行できます...

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

Powershellスクリプトへのファイルのドラッグアンドドロップ を処理する方法しかわからない場合。

22
Nathan Hartley

バッチファイルからPowerShellスクリプトを呼び出す理由とその方法の両方について説明します 私のブログ投稿はこちら

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

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スクリプトファイルを同じディレクトリに配置することをお勧めします。

8
deadlydog

問題は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

それが動作します。ただし、必要はありません。関数宣言を省略して、本体をスクリプト自体に移動するだけです。

param($path)
$tempfile = "C:\temp.txt"
set-ExecutionPolicy Unrestricted
get-content -Path $path -encoding utf8 | out-file $tempfile -encoding Unicode
set-ExecutionPolicy Restricted
5
stej
# 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'}"

ただし、次のような方法で回避できます。

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

.PS1ファイル名にスペースを使用しないでください。

3
Gordon Bell

私はこれを機能させました... 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
1
Th3Fix3r

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

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
0
x0n