読者です 読者をやめる 読者になる 読者になる

PowerShellからバッチファイル(.bat)を実行できない

PowerShell windows

【改訂新版】 Windows PowerShell ポケットリファレンス

はじめに

最近業務で使っているサーバが  Windows Server 2003(既にサポート切れ)から、ようやく Windows Server 2012 になり、PowerShell が標準搭載されました。

 

基本的には、旧来からのバッチファイル(コマンドプロンプト)よりも、PowerShell の方が遥かにパワフルなので、バッチファイルに出来ることは PowerShell に置き換え可能です。

 

ですが、バッチファイルにはレガシーシステムで利用されていた膨大な既存資産があるため、これが動かなくなるのは困ります。

 

試しに Windows Server 2012PowerShell から既存資産のバッチファイルを実行したところ、エラーが発生して動かない!

 

調べてみてもなかなか情報が見つからず焦りましたが、実はUNIXシェルなどの世界では当たり前の作法が抜けていただけでした。

 

Windows という井戸の中にどっぷり浸かっていると、UNIXLinux という大海を知らずに恥をかくよ、というのが今回のお話。

 

結論

相対パス(./hoge.bat)、もしくは絶対パス(C:/fuga/hoge.bat)を指定する

 

 

経緯

PowerShell から既存資産のバッチファイルを実行すると以下のエラーが発生!

hoge.bat : 用語 'hoge.bat' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラム
の名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認
してから、再試行してください。

 

色々調べてみても「バッチファイルからPowerShellを呼び出す」という情報は見つかるが、「PowerShellからバッチファイルを呼び出す」という情報が見つからない!

バッチファイルから PowerShell を呼び出す方法 - Qiita

 

日本語での情報を諦め、英語での情報を集めたところ、こんな記事を発見!

Running a .bat file from PowerShell - Spiceworks

 

PowerShell からコマンドプロンプト(cmd.exe)を起動すれば良いらしいので、以下のコマンドを実行してみる。

cmd /c "hoge.bat"

 

試してみると一応動きはするものの、コマンドプロンプト(対話モード)から抜けられず、改めて exitコマンドを打たないと PowerShell に復帰しない。

 

困り果てていると、今度はこんな記事を発見!

Windows PowerShellコマンド&スクリプティング入門:PowerShellスクリプティングの第一歩(後編) (1/5) - @IT

 

そこには、こんな気になる記述が・・・

実行に関する注意1―PowerShellはカレント・フォルダを検索しない

 

内容は PowerShellスクリプト(.ps1)に関するものだが、エラーは全く一緒!

これが原因と考えて間違いなさそうな予感。

 

そこで今度は PowerShell から以下のコマンドを打ってみる。

./hoge.bat

 

今度は問題なく実行されました。めでたしめでたし。

 

まとめ

ちなみに PowerShellスクリプト(.ps1)は、ダブルクリックでは実行できません。

あくまで PowerShell を起動してから、スクリプトを指定する必要があるようです。

PowerShellスクリプトへのショートカットを作成する − @IT

 

そんな理由から先の「バッチファイルからPowerShellを呼び出す」という記事が書かれていたんですね。

バッチファイルならダブルクリックで実行できるので、バッチファイル ⇒ PowerShell と呼び出せば、PowerShell をダブルクリックで実行できるってわけですね。

 

Indeed からの求人