- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:setxコマンドが思い通りにいかない)
setxコマンドでパスを挿入する方法とは?
このQ&Aのポイント
- setxコマンドを使用してシステム環境変数PATHにパスを挿入しようとしていますが、思い通りにいかない問題が発生しています。
- setxコマンドを実行すると、意図しない動作が発生し、ユーザー環境変数にPATHが作成されてしまいます。
- また、パスの優先順位を考慮してパスを先頭に挿入したいという要件もあります。現在のPATHの値は%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (2)
- kteds
- ベストアンサー率42% (1882/4440)
回答No.2
セミコロンは何の理由で記述しているのでしょうか? 構文規則通り(セミコロンなし、%PATH% をダブルクオテーション囲み )にすると、どうなりますか? setx C:\hoge "%PATH%" /M
質問者
補足
あ、すみません。構文を誤っていました。 正確には setx PATH "C:\hoge;%PATH%" /M と入力しています。
- bin-chan
- ベストアンサー率33% (1403/4213)
回答No.1
setx "C:\hoge”;%PATH% /M じゃないの? ダブルクォーテーションで囲む必要があるのは ”C:¥Program Files”のような途中に空白を含む場合。 C:¥hoge くらいなら囲む必要ありません
質問者
補足
ユーザー入力に任せる形を取っているため、C:\hogeとは限りません。 また、%PATH%にもともと半角スペースが含まれる可能性も考慮したつもりです。 その為、ダブルクォーテーションは必須と考えています。 調べた結果、%PATH%の最後が「\」で終わっていると発生するようですし、 もともと%SYSTEMROOT%として登録されていた値が全て展開されてしまうし、 setxはあまり有用ではなさそうでしょうか?
お礼
色々調査頂き、ありがとうございます。 結果的にsetxの挙動が最適とは思えず、WSHによる実行の方がよっぽど安定していると判断した為、 スクリプトでの環境変数操作を行うことにしました。(WinXP、Win7x86, Win7x64で確認済み) 【実行.bat】 call 環境変数登録.wsf "SYSTEM" "PATH" "c:\hoge" 1 【環境変数登録.wsf】 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <package> <job id="environment"> <?job error="true" debug="true" ?> <object id="objFs" progid="Scripting.FileSystemObject" /> <script language="VBScript"> <![CDATA[ '** '* 引数1 : SYSTEM -> システム環境変数。全ユーザーに適用, '* USER -> ユーザー環境変数。ログオン・ユーザーごとに適用, '* PROCESS -> プロセス環境変数。現在有効な全環境変数(読み込み専用), '* VOLATILE -> 一時環境変数。ログオフと同時に破棄される一時的な環境変数 '* 引数2 : 環境変数名(例:PATH) '* 引数3 : 設定値 '* 引数4 : 0 -> 設定値のみを設定する '* 1 -> 設定値を先頭に挿入する '* 2 -> 設定値を末尾に追加する '* '*/ Set objArgs = WScript.Arguments.Unnamed Set objShell = WScript.CreateObject("WScript.Shell") Set objEnv = objShell.Environment(objArgs.Item(0)) Select Case objArgs.Item(3) Case 1 objEnv.Item(objArgs.Item(1)) = objArgs.Item(2) &";" & objEnv.Item(objArgs.Item(1)) Case 2 objEnv.Item(objArgs.Item(1)) = objEnv.Item(objArgs.Item(1)) &";" & objArgs.Item(2) Case Else objEnv.Item(objArgs.Item(1)) = objArgs.Item(2) End Select ]]> </script> </job> </package>
補足
えっと、C:\hogeはユーザーの入力に任せる為、C:\hogeとは限りません。 ダブルクォーテーションは、半角スペースなどが含まれている場合に、文字列の範囲を明示的に 決定するものだと認識しています。 その結果、ヘルプの例に従うと以下のいずれかになると考えます。 setx PATH "%ARGS1%;%PATH%" /M setx PATH "%ARGS1%";"%PATH%" /M (%ARGS1%部分は、set /pによってユーザー入力から受けた「C:\hoge」など) いずれも結果は同じで、ユーザー環境変数に登録され、かつコマンド(/M)までもが文字列だと認識されて 登録されてしまいます。 調べた結果、元々PATH内の最後に「\」が含まれていると、現象が発生します。 また、setxの動作に以下2点の不満がありました。 ・バッチから実行する関係上、登録されている文字列が全て展開されてしまう。 (「%SYSTEMROOT%」が「C:\Windows」のように) 結果的に、設定値の追加・挿入ではなく、完全な差し替えを行っているかのようになり、 差分確認が正確に行えない。 ・設定値が1024文字を超過すると切り捨てられる。