
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\
完全にお手上げ状態です。
どうすると正常に設定が行われるかご教示ください。
No.3ベストアンサー
- 回答日時:
No.2の補足です。
> 正確には
> setx PATH "C:\hoge;%PATH%" /M
> と入力しています。
ですから、setxの構文通りにしてみてはどうでしょうか、と書いたのですが・・・
なんだか話がかみ合っていないようですね。
setxコマンドのヘルプを参照してはどうでしょうか。
添付画像は setx /? の例: です。

この回答への補足
えっと、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文字を超過すると切り捨てられる。
色々調査頂き、ありがとうございます。
結果的に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>
No.2
- 回答日時:
セミコロンは何の理由で記述しているのでしょうか?
構文規則通り(セミコロンなし、%PATH% をダブルクオテーション囲み )にすると、どうなりますか?
setx C:\hoge "%PATH%" /M
この回答への補足
あ、すみません。構文を誤っていました。
正確には
setx PATH "C:\hoge;%PATH%" /M
と入力しています。
No.1
- 回答日時:
setx "C:\hoge”;%PATH% /M
じゃないの?
ダブルクォーテーションで囲む必要があるのは
”C:¥Program Files”のような途中に空白を含む場合。
C:¥hoge くらいなら囲む必要ありません
この回答への補足
ユーザー入力に任せる形を取っているため、C:\hogeとは限りません。
また、%PATH%にもともと半角スペースが含まれる可能性も考慮したつもりです。
その為、ダブルクォーテーションは必須と考えています。
調べた結果、%PATH%の最後が「\」で終わっていると発生するようですし、
もともと%SYSTEMROOT%として登録されていた値が全て展開されてしまうし、
setxはあまり有用ではなさそうでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 VirtualBox 7のゲストOSでの物理HDDパーティションのマウント方法 2 2023/05/04 13:01
- Windows 10 pathが通らない 2 2023/03/27 11:28
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- その他(開発・運用・管理) WindowsからSSHでサーバーにあるファイルをダウンロードできない…。 3 2022/04/24 11:08
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- UNIX・Linux cronの@rebootでのdateコマンドの実行につきまして 2 2023/06/11 16:23
- Mac OS PATHを使ってcdなどで簡単に移動できるようになりたい 3 2023/05/13 14:22
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- UNIX・Linux AWSのEC2のZabbixユーザーでawscliコマンドが実行できない状態を解決する 1 2022/12/06 22:17
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UNIX コマンドにおける # や円...
-
@EOD
-
Excel下部のメニューが消えた
-
shutdownコマンドをキャンセル...
-
至急です、Ubuntuに詳しい方助...
-
vbaで「最前面に」とする方法は?
-
SCコマンドでアクセス拒否
-
DOSプロントのeditコマンド
-
JP1での保留Job一覧取得につき...
-
Linuxでコマンドが終了しない
-
[シェルスクリプト内で bashコ...
-
echo $!の意味を教えてください
-
Macでldコマンド、ldconfigコマ...
-
文字コード
-
イラストレーターでオブジェク...
-
コマンドプロンプトにおけるコ...
-
at コマンドで同時刻に登録され...
-
windowsコマンドでUnixのcutコ...
-
レコーダー換装用のHDDのAVコマ...
-
LinuxOSのtopコマンド結果がお...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UNIX コマンドにおける # や円...
-
shutdownコマンドをキャンセル...
-
ワイルドカードを使ってでフォ...
-
Excel下部のメニューが消えた
-
SCコマンドでアクセス拒否
-
[バッチファイル]レジストリ値...
-
コマンドプロンプトにおけるコ...
-
Linux:sedコマンドで置換がし...
-
Linuxコマンドは何の言語で書か...
-
AIXでの文字コード、改行コード...
-
Linuxでコマンドが終了しない
-
コマンドプロンプトで変数内に...
-
コマンド履歴が~/.bash_history...
-
echo $!の意味を教えてください
-
compressコマンドってなくなっ...
-
「環境変数名の編集」ウィンド...
-
vbaで「最前面に」とする方法は?
-
クイックアクセスツールバーに...
-
JP1での保留Job一覧取得につき...
-
レコーダー換装用のHDDのAVコマ...
おすすめ情報