PowerShellからバッチファイル(.bat)を実行できない
はじめに
最近業務で使っているサーバが Windows Server 2003(既にサポート切れ)から、ようやく Windows Server 2012 になり、PowerShell が標準搭載されました。
基本的には、旧来からのバッチファイル(コマンドプロンプト)よりも、PowerShell の方が遥かにパワフルなので、バッチファイルに出来ることは PowerShell に置き換え可能です。
ですが、バッチファイルにはレガシーシステムで利用されていた膨大な既存資産があるため、これが動かなくなるのは困ります。
試しに Windows Server 2012 の PowerShell から既存資産のバッチファイルを実行したところ、エラーが発生して動かない!
調べてみてもなかなか情報が見つからず焦りましたが、実はUNIXシェルなどの世界では当たり前の作法が抜けていただけでした。
Windows という井戸の中にどっぷり浸かっていると、UNIX や Linux という大海を知らずに恥をかくよ、というのが今回のお話。
結論
相対パス(./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 をダブルクリックで実行できるってわけですね。