ネットワークにあるPowerShellスクリプトをバッチファイルから起動する方法を紹介します。PowerShellスクリプトと起動用バッチファイルをセットでどこに配置しても動作する汎用性を持たせます。
ファイルパスを指定する方式として2つあります。
1つはMS-DOS時代からの形式です。PC内のドライブ限定の方式です。 もう1つは、ネットワーク上のファイルにもアクセスできるように UNC (Universal Naming Convention)という形式があります。 サーバー上にPowerShellスクリプトとその起動バッチファイルを配置し、クライアントから起動します。 \Server\share\test.bat test.batの内容 バッチファイルはカレントディレクトリを \Server\share にセットできないため起動できません。 こんな感じにすれば起動はできます しかし、フルパスが書かれているのは非常に格好悪い。test.ps1とtest.batをセットにしておけば、ネットワークでもローカルでも自由に配置して起動できるようにしておきたいです。ソフト屋はそんな事にこだわる職業ですw ネットワークドライブを使用すると、ネットワークの共有を仮想ドライブにマウントできます。それを利用するとこんな感じに解決できます 解決はできるのですが、汎用性の面では問題があります。Zドライブを誰かが使用しているかもしれません。これだけのためにドライブの割り付けルールを作るのは大げさすぎるし、空きドライブをサーチするロジックを組むのもややこしくなる。 バッチファイルには起動したときのパスや引数を参照できる環境変数があります。その中の%~dp0 を使用します。 完成系はこちらです。 奇麗にまとまりました。これで、PowerShellと起動用バッチファイルをセットでどこにでも配置できます。
概要
ドライブ名:\ディレクトリ・・・
\\コンピュータ名\共有名\ディレクトリ・・・
バッチファイルはコマンドプロンプトの機能になりますが、実行ディレクトリは昔ながらのMS-DOSの方式に限られています。コマンドプロンプトはMS-DOSの改良版なのでそれを色濃く引きずっています。解説
\Server\share\test.ps1PowerShell -ExecutionPolicy RemoteSigned test.ps1
PowerShell -ExecutionPolicy RemoteSigned \\Server\share\test.ps1
解決策1 ネットワークドライブ
subst Z: \\server\share
PowerShell -ExecutionPolicy RemoteSigned z:\test.ps1
subst Z: /D
解決策2 環境変数
バッチファイルのフルパスからファイル名を取り除いたパスが取得できます。
例えば \Server\share\test.bat を起動すると、%~dp0 は \Server\share になります。PowerShell -ExecutionPolicy RemoteSigned %~dp0\test.ps1