treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

バッチファイルでPowerShellコマンド実行

ちょっとしたTIPSですが、バッチファイルでPowerShellコマンドを実行したい処理があったので、そのやり方をご報告します。

かなり難しく考えていたのですが、実は簡単だった…。

バッチファイルで実行したい

以前に

blog.treedown.net

こういうことがあったもんですから、

blog.treedown.net

これで手動でPowerShellコマンドを一発入力で解決、だったのですが、複数のPCに対して他の初期設定を処理するバッチファイルの中にこの処理を一つ差し込みたい、と考えました。

ん?でも待てよ…、これはWindowsのコマンドではなく「PowerShellコマンド」なので、○○.batの中にPowerShellの処理を差し込むってのは、できないんじゃ…?と疑問に思ったところがスタート。

実は簡単だった

探しても、PowerShellでできるよ!的な情報とか、GUIでこうやって操作しますよ、とかそういう情報を眺めること1・2時間が経過していました。
ムダに、netshコマンドでできないか、とか思い、netshコマンドのオプションを調べ始めたりして、あーできないなぁ…、とか思っていました。

やっぱPowerShellスクリプト(.ps1)を個別に用意するしかないかなぁ、と思い始めたときにふと、

「コマンドプロンプトからPowerShellのスクリプトを呼び出せればいいんじゃないの?」

ということで、バッチファイルからせめてPowerShellスクリプト(.ps1)を呼び出せないか、と調べてみました。

バッチファイル内でPowerShell

WindowsのコマンドプロンプトからPowerShellスクリプト(.ps1)を実行する場合には「powershell -File」に続けてPowerShellスクリプト(.ps1)を入力し、実行すればOKです。
例えば、Paramexc.ps1という名前のPowerShellスクリプト(.ps1)を実行するとしたら、

powershell -File Paramexc.ps1

と記述します。フルパス(例えばc:\temp配下など)を指定する場合でもそのまま

PowerShell -File "c:\temp\Paramexc.ps1"

と指定します。こうすると、WindowsコマンドプロンプトからPowerShellスクリプト(.ps1)を実行できるので、バッチファイルでもPowerShellコマンドを実行できることになります。

と、思ったのですが、ちょっと待てよ?PowerShellコマンドを直接実行する方法もあるじゃないですか。

その方法は「PowerShell -command」に続けてPowerShellコマンドを記述します。

f:id:treedown:20190107121612p:plain

今回の例としてはネットワークカテゴリを変更する「Set-NetConnectionProfile -NetworkCategory Private」を実行したいため、バッチファイルに以下の行を追加します。

PowerShell -command "Set-NetConnectionProfile -NetworkCategory Private"

この行では、PowerShellのコマンド実行環境を呼び出して、-commandオプションに続くPowerShellコマンドをバッチファイル内で実行することができます。

結局バッチファイルには上記の記述で書き込んで、うまく動作することを確認しました。

ちなみに(動機)

通常の用途ならPowerShellスクリプト(.ps1)を用意して実行すればいいだけの話なのは間違いないのですが、今回は、キッティング作業の際に使うバッチファイルをまとめたかった(つまりバッチファイル一回に収めたかった)ところが発端になっています。
幾つかの簡単な処理をバッチファイル一つにまとめているのでバッチファイル以外にも.ps1ファイルを実行しなきゃいけない、ってのを増やすと実行し忘れ、というケースもあるもしれないのでできるだけ実行忘れを防止する意味でもバッチファイルにまとめたかったのです。

ちなみに-2、レジストリキーでできない?

レジストリキーを弄ればいいんじゃないか、とも思ったので、レジストリキーを探してみると、Windows7までは

HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures

内に

010103000F0000F0010000000F0000F0C967A3643C3AD745950DA7859209176EF5B87C875FA20DF21951640E807D7C24

という固定キーがあって(なければこの固定キーを作成して)から

Category

というDWORD値を用意して、値にプライベートネットワークなら「1」、パブリックネットワークなら「0」を作成してやればOKだったんですが、Windows10からは

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles\{任意のGUID}

と、ネットワーク個別にCategoryというDWORD値を持つようになっていて、この識別されたネットワークが複数あるとたくさんのPCを一括で設定するのが難しいんですよね。

そんなこんなで、バッチファイルにPowerShellコマンドを入れる方法で処理しました。いやあ、見つかってよかった。