【bat上級編】電源プランを操れ!powercfgとバッチファイル

この記事の概要を簡単まとめ!

  • バッチファイル作成の上級編
  • cmdで電源プランを操作できる”powercfg.exe”
  • これまでの内容と新しいコマンドをフルに活用したバッチファイル
  • サブルーチン化でバッチファイルの可読性も確保
  • 解説で「こういう処理をしている」が分かるようになる
  • 「GUIでやるより簡単」を目指して

バッチファイルシリーズもこれで第3回となる。これまではコマンドの解説と簡単なコマンド使用例を記述し、自分で改造可能なものを最終的な完成品として仕上げていた。しかしこれまでのバッチファイル解説は、初心者が入りやすいよう、難易度が低めのものから行ってきた。したがって、バッチファイル全体としては、難しい機能は殆ど使用していない。

それも、今回取り上げるpowercfg.exeまで抵抗なく入れるようにしたためである。バッチファイルで書きたい本命はこれであり、それまで書いてきたものは、導入のための土台である。とはいえ、これまでやってきたことは決して無意味ということではなく、これまでやってきたことの積み重ねで本命に挑むのである。

その結果、上級編に相応しいまでの難易度になった今回だが、そうであっても何の問題もなく使えるよう、この記事で指南していく。最後まで見ていくといい。

バッチファイル作成と解説:上級編

はじめに:第1回・第2回記事の紹介

第1回を初級編・第2回を中級編としているため、これらを読んでいることが流れ的に前提となる。そのため、読んでいない人は下記リンクから読める。大きくなりすぎて邪魔なので、カードは格納している。

第1回:【コマンド入力】CMDとバッチファイルでショートカット 入門編

第2回:【bat中級編】分岐と選択でまとまるバッチファイルの作成

system32下のアプリケーション

cmd.exeは、システム環境変数PATHで、ディレクトリの移動をしなくてもファイルを呼び出すことができる。このため様々なアプリケーションを、cmdはコマンドで起動することができるのである。

中でもcmdの標準ディレクトリである、C:\Windows\System32にはcmdでのみ扱えるアプリケーションが多数存在する。今回取り上げるのは電源プランを操作する”powercfg.exe“である。それ以外にも、Windowsサービスを(非常に強い権限で)操作する”sc.exe”、IPアドレスやアダプターの状態を調べる”ipconfig.exe”、ディスクエラーの調査・修復を行う”chkdsk.exe”などがある。これらのアプリケーションは殆どの場合GUIが存在しないため、cmdから扱うのみとなっている。



これらのアプリケーションは、cmdから単独で使用しても何も起こらない。多くの場合オプションを使用し、そのアプリケーション固有のコマンドを使用する必要がある。このコマンドに関してはWindows標準アプリケーションである関係から、Microsoft Docsに各アプリケーションのリファレンスが存在する。基本はこのリファレンスを参考に使用するため、全てを記憶しておく必要はあまりない。その点では便利である。

ソースコードの前に:powercfgと追加で使用するコマンド解説

今回も最後にpowercfgを使用して、cmdから電源プランを変更するバッチファイルのソースコードを掲載する。だが、必要かつまだ解説していないコマンドがあるため、それを解説した後、本題のpowercfgの解説及びソースコード解説を行う。なお、前回と同様に前回までの内容については、既に知っているものとして進行する。

cmd標準のコマンド

ここでは、この後で紹介するバッチファイルのソースコードで使用する新しいコマンドと、前回解説した中で使用していないオプションについての解説が中心となる。とはいっても、解説と共にいつものように使用方法を示したソースコードを記述する。

cmd/バッチファイル:call

callコマンドは、他のバッチファイルや同一バッチファイル内のサブルーチン1)ある特定の処理について、1つのパッケージのようにまとめておき、別のプログラムからそれを呼び出して実行できるようにしたもの。cmd/バッチファイルにおいてのサブルーチンは、goto文で使用したラベルを利用する。通常はラベルからexit /b [Errorlevel]までが1つのサブルーチンとなる。を呼び出すためのコマンドである2)参照:Call – DOS コマンド一覧 – Programming Field。今回の場合はサブルーチンを呼び出すために使用する。まずは使用例を掲載する。

callコマンドは読んで字の如く、「呼び出す」のである。今回はサブルーチンを呼び出すのに使用している。サブルーチンを呼び出す場合の基本構文は、call :<ラベル名> <引数> である。引数は最大9個まで渡すことができる。10個以上の場合は特別な設定が必要だが、使う必要がないのでここでは割愛する。

callコマンドでサブルーチンが呼び出されると、それまでの処理は一時中断され、サブルーチンの処理が開始される。サブルーチンでも処理は順序処理で行わる。サブルーチンの終了はexit /b [Errorlevel]をするか、ファイルの終端に到達することである。通常はexit /b [Errorlevel]で終了する。

また、サブルーチンはそこで条件処理などをさせて、その結果によって動作を変更するかどうかを決めるのにも使用する(所謂戻り値)。上記の例では文字列が入力されていれば0、そうでないなら1を返している。これが環境変数Errorlevelに格納される。ifはErrorlevelを条件分岐で使用できるため、これを使って10行目で条件分岐に使用している。この動作を、最後に解説するpowercfgのソースコードで使用する。




補足:callの引数と戻り値について

callの引数は、callで引数を渡した順に%1から%9で参照できる。今回の例では%1のみである。また参照する際、%と数字の間にチルダ<~>を入れない場合、ダブルクォーテーションも含めて参照し、チルダを入れた場合、ダブルクォーテーションを含まずに参照する。文字列を引数として渡した場合、チルダを入れて参照することが多い。

また、サブルーチンの戻り値に関しては、exit /b [Errorlevel]で任意の値を環境変数Errorlevelの戻り値に指定できる。この値は0を正常終了、それ以外を何らかのエラーによる終了としている。そのため、サブルーチン内での条件分岐の結果でErrorlevelを変え、その値によって処理を変えるのが一般的である。

cmd/バッチファイル:for

forと聞くと、多くの人がforループという名称で、繰り返しの処理に使用するものと想像する。これはcmdでも同じである。本来の用途はファイルの操作だが、繰り返し処理にも当然使用することができる3)参照:For – DOS コマンド一覧 – Programming Field

ただし、今回紹介する機能に関しては、はっきり言って通常ではない使い方の度を越しているため、紹介が非常に難しい。したがって、今回使用することにのみ絞って解説することにする。面倒は嫌いなので仕方ない。

今回のforコマンドは、for /fの場合である。/fを使用すると、トークンを指定できるようになる4)ここでのトークンとは、スペースで区切られた文字列のことを示す。例の場合、a1 b2 c3 d4 e5がそれぞれトークンとなる。 参照:[バッチ] for と 「/f “tokens=〇”」 を使って、スペース区切りの文字列の必要列だけ取り出す – Qiita。そこで、今回使用するのはtokens, usebackqである。tokensはトークン番号の指定を行う。つまり、[n]番目のトークン(文字列)を取得するように指定できる。そしてusebackqはcmdで使用できるコマンドを出力の対象とすることができるのである。

本来はテキストファイルを読み込むようにできているforコマンドだが、usebackqでコマンドが使えるようになる。よって、変数に格納した文字列から特定のトークンを取り出したい!となったとき、このオプションで変数をechoで展開し、その結果に対して適用すれば、特定のトークンを取り出せる、と言う構造となっている。なお、コマンドを認識させるにはアクサングラーブ<`>5)アクサンクラーブは、shift+@で出せる記号である。なおusebackqでの()内は、アクサンクラーブでコマンド、クォーテーション<‘>で文字列、ダブルクォーテーション<“>でファイル名を扱える。でコマンドを囲う必要がある。また、コマンドの結果を別のコマンドへ渡す、パイプ6)コマンドの結果を次のコマンドに渡す、記号コマンドの1つ。も使用できる。その場合、コマンドとコマンドの間に ^| と記述する必要がある。

この設定により、echo %testStr%の結果に対して、3番目のトークンを取得するよう命令を出すことができる。もっともこの例ではforで行う意味はあまりないが、この方法を最後に解説するバッチファイルで使用しているための解説である。

今回新しく使用する、cmd標準コマンドの解説は以上である。




powercfg.exeとオプション

ここからはpowercfg.exeの解説に移る。powercfg.exe, 単純にpowercfgは、電源プランの操作が主である。それ以外にもバッテリー診断やスリープ・休止モードの管理なども行える。このあたりの操作はGUIでは難しく、powercfgでなければ殆どの場合操作できないものである。

ここでの解説も、今回使用するものだけに絞って行う。なお、その他のpowercfgのオプションに関しては、Microsoft Docsのリファレンスを参考にするといい7)参照:Powercfg のコマンド ライン オプション | Microsoft Docs

今回使用するコマンド(1つにまとめている)

今回使用するコマンドについて、下記の使用例でまとめている。また、コマンドを実際に使用した画像をソースコードの下に示す。

powercfg各オプションの実行結果
powerdfg /getactivescheme, /list, /setactiveを行ったときのイメージ。/setactiveで変更したいプランのGUIDを入力すると変更されていることが確認できる。

各オプションについて軽く解説する。/getactibeschemeは現在の電源プランを表示する。/listは全ての電源プランを表示するものである。このとき、電源設定のGUIDも同時に表示される。GUIDはpowercfgで電源プランを操作する際に重要な値であり、powercfgでは度々使用される。そして/setactiveは変更したいプランのGUIDを入力することで、その電源プランをアクティブにするオプションとなっている。

/listの出力結果を見ると分かるのが、GUIDは3番目のトークンである。先程解説したfor /fのトークン番号指定を行うことで、GUIDを取り出すことが可能になる。ただしそのままでは列ごと取り出してしまうため、GUIDを1つだけ取り出すにはまだ一工夫必要になる。これはそのときに解説する。



powercfgではもっと細かく設定も可能であるが、今回は電源プランを変更するのが目的のため、必要最低限に留めている。これで、今回使用するコマンドの解説は完了である。次項で、本題のバッチファイルの作成とその解説を行う。

上級編:powercfgで電源プランを変更するバッチファイル

相変わらず解説が長すぎて申し訳ない。こうしないと途中で脱落してしまう人がいるためである。それでは、powercfgで電源プランを変更するバッチファイルを作成する。ソースコードは下記に示す。

このバッチファイルの流れとしては次の通りである。

  1. powercfg /getactivescheme で現在の電源プランを表示する
  2. powercfg /list で全ての電源プランを表示する
  3. set /p で変更したい電源プランのGUIDを先頭から4文字入力させる
  4. サブルーチン1:4文字チェック。現段階では4文字丁度で設定。それ以外は最初に戻る
  5. サブルーチン2:GUID存在チェック。存在する場合電源プランを変更、存在しない場合は最初に戻る
  6. バッチファイルを終了する

基本的な動作は解説した通りである。解説用にコマンドの前後にコメントを残しているため、これを読めば動作の大半がわかるようになっている。また、実際に使用したイメージは以下である。

test004_pp.bat実行結果
test004_pp.batの実行結果。左上から右下へ見る。バッチファイルの記述どおり、4文字以外のとき、該当するGUIDがないときはエラーの旨を表示して戻り、該当するGUIDがある場合電源プランの変更に成功した旨を表示して終了している。現在は4文字固定であるため、改良の余地はある。

追加解説:特殊な使い方

38行目の右辺の変数の展開時の特殊な使い方、59行目のfindコマンドについては、別途解説する。

38行目では、右辺の変数の展開時に”:~1″と記述している。これは展開位置をずらすオプションである。cmdでも文字列の先頭を0文字目とするため、先頭の文字を削る場合”:~1″を記述することで、1文字目から文末まで展開する。38行目では、展開した文字列を自分の変数に再度格納し、1文字削っているのである。これが最終的にnullになるまで行う。



59行目のfor文の()内で、powercfg /listの結果をパイプでfindコマンドに渡している。このfindコマンドは指定した文字列を検索するコマンドである。ここでの指定した文字列は変更したい電源プランのGUIDの先頭から4文字のことである。このコマンドは本来はファイルに対して使用するが、パイプによりpowercfg /listの結果に対してfindしている。つまり、powercfg /listの結果を擬似的にファイルと見ているのである。

このときfindでは一致した「行」を抜き出している。つまり、「電源設定の GUID: [GUID] (電源プラン名)」を抜き出しているのである。さらにこの結果に対してfor /fで3番目のトークンを取得するように設定しているので、最終的にGUIDのみを抜き出すことができるのである。

全体の解説は以上である。もし、これを読んでわからないことなどがあった場合、コメント欄での質問を受け付けている。また、このバッチファイル自体にも改良の余地があるため、更新する可能性もある。

「GUIでやるより簡単」を目指して

今回は上級編として、powercfgとそれに至るまでの、新規に使用するコマンドの解説を行った。上級編といいつつも実際の難易度はプロ級のような気がしないでもないが、powercfgをより簡単に利用できるようなバッチファイルができたとは、自信を持って言える。流石にここまでやってしまうと、やりすぎなのかもしれないが。

しかし、電源プランの変更は、実は面倒であったりする。というのも、ツールバー上から電源プランを選択する場合、2個しか選択肢がない(現在のプランと別のプラン)ために、いちいち新たにウィンドウを開いて選択しに行かなければならない。それに、ウィンドウを表示するためのリンクが小さいこともあり、どうにも操作しづらいように感じる。私からすれば、ウィンドウを移動することがどうしても煩わしいのである。



その点トッポってすげぇよな、最後までチョコたっぷりだもん。バッチファイルを自分で作り、それをcmdで動作させれば、cmdの画面1つで電源プランが選択できてしまうのである。もちろんウィンドウはcmdのみであり、複雑な画面移動はない。今回は手入力が少しあるのでそこで多少時間は掛かるが、それはバッチファイルの作り方次第でいくらでも改良可能である。それこそ極めれば、たった1文字、或いはエンターの1押しだけで変更可能になる。それは、GUIでやるより簡単、と言える。

他にも、GUIでやるのが面倒なことというのは多々ある。例えば、Windows7以前の環境変数である。Windows7以前の環境変数の編集は、GUIは非常に見難い構成となっており、以前に環境変数を追加したかどうかもわからないほどである。その場合には、見やすく処理した上で、追加ないし削除処理できるバッチファイルを作ってしまった方が楽である。現在のOSは殆どがWindows10ではあるものの、互換性からアップグレードしていない場合、有用性は十分にある。なお、作るかどうかは未定である。

一応、今回をもってバッチファイルシリーズは終了となるが、バッチファイルで何かしたいアイデアが浮かべば、気まぐれに書いていく予定である。ただしその場合でも、リファレンスの詳細はなるべく載せるつもりである。途中で読むのが面倒にならないための処置であるが、これを書く私が面倒であったりする矛盾がある。ともあれ、書きたいときに書くことにしているので問題はないだろう。

 

以上、バッチファイル上級編 -powercfgで電源プラン操作- であった。それでは、次回の記事で会おう。

 

リンクス岐部(LINKS-KIBE) at 21:00 May. 20th, 2020


スポンサーリンク




脚注   [ + ]

1. ある特定の処理について、1つのパッケージのようにまとめておき、別のプログラムからそれを呼び出して実行できるようにしたもの。cmd/バッチファイルにおいてのサブルーチンは、goto文で使用したラベルを利用する。通常はラベルからexit /b [Errorlevel]までが1つのサブルーチンとなる。
2. 参照:Call – DOS コマンド一覧 – Programming Field
3. 参照:For – DOS コマンド一覧 – Programming Field
4. ここでのトークンとは、スペースで区切られた文字列のことを示す。例の場合、a1 b2 c3 d4 e5がそれぞれトークンとなる。 参照:[バッチ] for と 「/f “tokens=〇”」 を使って、スペース区切りの文字列の必要列だけ取り出す – Qiita
5. アクサンクラーブは、shift+@で出せる記号である。なおusebackqでの()内は、アクサンクラーブでコマンド、クォーテーション<‘>で文字列、ダブルクォーテーション<“>でファイル名を扱える。
6. コマンドの結果を次のコマンドに渡す、記号コマンドの1つ。
7. 参照:Powercfg のコマンド ライン オプション | Microsoft Docs
Links_Kibe
会社員という働き方が合わないのに会社員になってしまった、自称社会不適合者。自力で稼いでいくために奮闘中。PCとラーメンとXperia 1をこよなく愛する、自由になりたい人である。ゲームやガジェット、仕事中心に書いていく。

コメントを残す

メールアドレスが公開されることはありません。
名前は必須項目となります。記入をお願いいたします。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)