プロが教えるわが家の防犯対策術!

setxコマンドでシステム環境変数PATHに、パスを挿入しようと思っています。

setx "C:\hoge;%PATH%" /M

とすると、なぜかユーザー環境変数にPATHが作られ、値が入ります。
更にユーザー環境変数に作られたPATHの値を除くと、
「C:\hoge;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0" /M」
となっており、なんだかコマンドが正常に処理されていないようでした。

因みにsetx "%PATH%;C:\hoge" /M
ならうまくいきますが、パスの優先順位的に最優先させたい為、先頭に挿入したいです。

また、PATHに入っている値は以下の通りです。
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\


完全にお手上げ状態です。
どうすると正常に設定が行われるかご教示ください。

A 回答 (3件)

setx "C:\hoge”;%PATH% /M


じゃないの?

ダブルクォーテーションで囲む必要があるのは
”C:¥Program Files”のような途中に空白を含む場合。
C:¥hoge くらいなら囲む必要ありません

この回答への補足

ユーザー入力に任せる形を取っているため、C:\hogeとは限りません。
また、%PATH%にもともと半角スペースが含まれる可能性も考慮したつもりです。
その為、ダブルクォーテーションは必須と考えています。

調べた結果、%PATH%の最後が「\」で終わっていると発生するようですし、
もともと%SYSTEMROOT%として登録されていた値が全て展開されてしまうし、
setxはあまり有用ではなさそうでしょうか?

補足日時:2013/12/24 23:34
    • good
    • 0

セミコロンは何の理由で記述しているのでしょうか?


構文規則通り(セミコロンなし、%PATH% をダブルクオテーション囲み )にすると、どうなりますか?
setx C:\hoge "%PATH%" /M

この回答への補足

あ、すみません。構文を誤っていました。

正確には
setx PATH "C:\hoge;%PATH%" /M

と入力しています。

補足日時:2013/12/25 08:54
    • good
    • 0

No.2の補足です。


> 正確には
> setx PATH "C:\hoge;%PATH%" /M
> と入力しています。

ですから、setxの構文通りにしてみてはどうでしょうか、と書いたのですが・・・
なんだか話がかみ合っていないようですね。
setxコマンドのヘルプを参照してはどうでしょうか。
添付画像は setx /? の例: です。
「setxコマンドが思い通りにいかない」の回答画像3

この回答への補足

えっと、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文字を超過すると切り捨てられる。

補足日時:2013/12/25 10:06
    • good
    • 0
この回答へのお礼

色々調査頂き、ありがとうございます。
結果的に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>

お礼日時:2013/12/25 10:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!