こんにちは!今回はレジストリの操作時に環境変数を含んだコマンドの使い方を紹介していきます。
環境変数はバッチ特有の動作をする変数です。
変数名を%で囲った形をしており、「%変数名%」と表記します。
コマンド実行時には先に構文解析を行い、環境変数があった場合に自動でその中身の値に置き換えてから、コマンドに引き渡します。
そのため、環境変数と同じ文字列を使った名前がある場合、勝手に置き換えが行われてしまい指定することができません。
そんな状況になったときにちゃんと置き換え前の%変数名%のままコマンドを実行する方法を紹介していきたいと思います。
事象例
レジストリキーの名前に環境変数が指定されている場合、何も考えずにこれを読み込もうとするとレジストリキーが見つからないといったエラーに遭遇してしまうことがあります。
例えば、コマンドプロンプトの設定値としてFontSizeキーを読み込もうとします。すると下記のようなコマンドになってしまうと思います。
reg query HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe /v FontSize
しかし、このコマンドを実行しても下記のように失敗してしまいます。
今回はこれを回避していきたいと思います。
原因
この事象の原因は「%SystemRoot%」が実行時に、その変数の値である「C:\Windows\」に置き換えられてしまったためです。
HKEY_CURRENT_USER\Console\C:\Windows\_system32_cmd.exe
上記のようなレジストリは存在しませんね。ちゃんと%がそのままコマンドを引き渡さないといけません。これを回避するには%をエスケープ(置き換えさせないように)する必要があるのですが、%%と二個重ねてみたり、””で囲ったりしてもうまくいきません。
環境変数は他の言語よりも素直で実直で融通の利かないヤツなのです。
解決方法
環境変数をエスケープするには「^」を使用します。
「%^SystemRoot%」と一つ目の%の後に記述すれば、きちんと%を含んだ文字列としてコマンドに渡すことができます。
レジストリキー名に環境変数がある場合
上記の例の通りですが、レジストリキー名に環境変数が含まれる場合はこのように記述すれば、Reg Queryコマンドで読み込むことができます。
reg query HKEY_CURRENT_USER\Console\%^SystemRoot%_system32_cmd.exe /v FontSize
レジストリキーの値に環境変数を設定したい場合
こちらでも何も考えずに下記のようなコマンドを打っても、環境変数が展開されたまま書き込まれてしまいます。
reg add HKLM\Software\test /v test /t REG_SZ /d %SystemRoot%
この場合でも、「^」を使ってあげれば正しく環境変数の文字列を含んだまま書き込むことができます。
reg add HKLM\Software\test /v test /t REG_SZ /d %^SystemRoot%
これで環境変数を含むレジストリでも、REGコマンドで自在に使うことができるようになりますね!
あとがき
今回はレジストリキーに環境変数を含む場合のコマンドについて書かせていただきました。
もちろんレジストリキーだけでなく、さまざまなシーンで環境変数を含んだままコマンドを実行したいケースはたくさんあります。
単純な「echo」でさえ環境変数の変数名のまま出力するのは厄介です。
「echo %SystemRoot%」と打ってもやはり置き換え後の値が出力されてしまうのです。
普段コンソールのみで運用している場合はあまり問題にならないのですが、変数名をテキストファイルに出力したい時などには厄介だったりします。
そういった時に^を追加すればうまく動作してくれると覚えておいてくださるとうれしいです。
何かのお役に立てれば幸いです。
コメント