PMPの流儀

PMPの流儀

エンジニアのページ

MENU

ネットワーク上のPowerShellスクリプトをバッチファイルから起動する

ネットワークにあるPowerShellスクリプトをバッチファイルから起動する方法を紹介します。PowerShellスクリプトと起動用バッチファイルをセットでどこに配置しても動作する汎用性を持たせます。

f:id:ruruucky:20210325010305p:plain

 

概要

ファイルパスを指定する方式として2つあります。 1つはMS-DOS時代からの形式です。PC内のドライブ限定の方式です。

ドライブ名:\ディレクトリ・・・

もう1つは、ネットワーク上のファイルにもアクセスできるように UNC (Universal Naming Convention)という形式があります。

\\コンピュータ名\共有名\ディレクトリ・・・


バッチファイルはコマンドプロンプトの機能になりますが、実行ディレクトリは昔ながらのMS-DOSの方式に限られています。コマンドプロンプトMS-DOSの改良版なのでそれを色濃く引きずっています。

解説

サーバー上にPowerShellスクリプトとその起動バッチファイルを配置し、クライアントから起動します。

\Server\share\test.bat
\Server\share\test.ps1

test.batの内容

PowerShell -ExecutionPolicy RemoteSigned test.ps1

バッチファイルはカレントディレクトリを \Server\share にセットできないため起動できません。

こんな感じにすれば起動はできます

PowerShell -ExecutionPolicy RemoteSigned \\Server\share\test.ps1

しかし、フルパスが書かれているのは非常に格好悪い。test.ps1とtest.batをセットにしておけば、ネットワークでもローカルでも自由に配置して起動できるようにしておきたいです。ソフト屋はそんな事にこだわる職業ですw

解決策1 ネットワークドライブ

ネットワークドライブを使用すると、ネットワークの共有を仮想ドライブにマウントできます。それを利用するとこんな感じに解決できます

subst Z: \\server\share
PowerShell -ExecutionPolicy RemoteSigned z:\test.ps1
subst Z: /D

解決はできるのですが、汎用性の面では問題があります。Zドライブを誰かが使用しているかもしれません。これだけのためにドライブの割り付けルールを作るのは大げさすぎるし、空きドライブをサーチするロジックを組むのもややこしくなる。

解決策2 環境変数

バッチファイルには起動したときのパスや引数を参照できる環境変数があります。その中の%~dp0 を使用します。
バッチファイルのフルパスからファイル名を取り除いたパスが取得できます。
例えば \Server\share\test.bat を起動すると、%~dp0 は \Server\share になります。

完成系はこちらです。

PowerShell -ExecutionPolicy RemoteSigned %~dp0\test.ps1

奇麗にまとまりました。これで、PowerShellと起動用バッチファイルをセットでどこにでも配置できます。