web-dev-qa-db-ja.com

setxを使用してWindows PATH変数に追加するにはどうすればよいですか?奇妙な問題を抱えている

setxを使用してWindows PATH変数を変更したい。以下は、Windows 8で少なくとも50%の時間動作します。

setx PATH %PATH%;C:\Python27\;C:\Python27\Scripts\

「デフォルトの引数は2回しか使用できない」というエラーが発生した場合、次のように動作することがあります。

setx PATH "%PATH%;C:\Python27\;C:\Python27\Scripts\"

違いは、2番目の引数を引用符で囲んだことです。 %PATH%がスペースを含むように展開される場合、引用符が必要だと思います。

ただし、Windows 7で奇妙な問題が発生しました。特定のWindows 7マシンで、この問題が発生しました。

echo %PATH%

以下を印刷します。

C:\Foo\;C:\Bar\;[...lots of stuff...]C:\Baz\

それから私はこれをします:

setx PATH "%PATH%;C:\Quux\"

次に、「エラー:1,024文字で切り捨てられました」と表示されます。 PATHに含まれるものを確認しましょう。

echo %PATH%

以下を印刷します。

C:\Foo\;C:\Foo\;C:\Bar\;C:\Bar\;[...lots of stuff, now duplicated...]C:\B

...そして1,024文字で切り捨てられます。重複のために実行されました。また興味深い点は、setxがエラーを発生させ、「成功」とは言わなかったにもかかわらず、PATHの値が変化することです。

この奇妙な動作を数回繰り返すことができました(幸いなことに、PATHの元の内容を保存していました)。

現時点では、PATHに追加する唯一の確実な方法は次のとおりです。

  1. echo PATH。

  2. PATHの内容をテキストファイルにコピーし、;C:\Python27\;C:\Python27\Scripts\をPATHの最後に手動で追加します。

  3. テキストファイルからすべてをコピーします。

  4. setx PATH "<paste the string here>"

このプロセスは、Windows 7とWindows 8の両方で常に機能します。

本当にこれを1つのコマンドで実行できるはずです。私は何を間違えていますか?

ありがとうございました。

64
SerMetAla

管理者としてcmdを実行し、次に:

setx /M PATH "%PATH%;<your-new-path>"

/ Mオプションは、SYSTEMスコープで変数を設定します。デフォルトの動作では、ユーザーに設定されます。

TL; DR

%PATH%をエコーすると、SYSTEM値とUSER値の連結が表示されるため、切り捨ての問題が発生します。したがって、setxの2番目の引数に追加すると、USER変数内のSYSTEMおよびUSER値に適合します。もう一度エコーすると、物事が倍になります。

また、/ Mオプションには管理者特権が必要なため、「管理者として実行」で端末を開く必要があります。そうしないと、setxが「レジストリパスへのアクセスが拒否されました」と文句を言います。

最後に注意してください:この方法で設定した直後に%PATH%をエコーし​​た場合、新しい値は表示されません。cmdを閉じて再度開く必要があります。

レジストリチェックに保存されている実際の値を確認する場合 この質問

70
Vituel

これは完全に機能します:

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set my_user_path=%B

setx PATH "C:\Python27;C:\Python27\Scripts;%my_user_path%"

最初のコマンドは、USER環境変数「PATH」を「my_user_path」変数に取得します。2行目は「C:\ Python27; C:\ Python27\Scripts;」を追加しますUSER環境変数「PATH」へ

10

管理者権限がなければ、私のために働いた唯一の方法は、次のコードを含むbatファイルです。

for /F "tokens=2* delims= " %%f IN ('reg query HKCU\Environment /v PATH ^| findstr /i path') do set OLD_SYSTEM_PATH=%%g
setx PATH "%USERPROFILE%\wev-tools;%OLD_SYSTEM_PATH%"

コードは回答の組み合わせです https://stackoverflow.com/a/45566845/4717152https://stackoverflow.com/a/10292113/4717152

4

誰かがPowerShellでそれを実行したい場合、それは以下のように動作します、

管理者としてPowershellを実行

それから

setx /M PATH "$Env:PATH;<path to add>"

確認するには、別のPowershellを開き、次のようにPATHを表示します。

$Env:PATH
4
NIK

setxに固執していない場合は、 pathed のような代替コマンドラインツールを使用できます。 https://superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7/655712#に代替のPATHエディターのより包括的なリストがあります655712

レジストリ値を直接編集することもできます。これは、setxが行うことです。詳細はこちら answer

%PATH%が1024文字で切り捨てられるのは奇妙です。 setxにはその問題はないと思った。ただし、おそらく無効なパスエントリをクリーンアップする必要があります。

4

私は同じ問題に直面していて、簡単な解決策を見つけました。

パスマンを使用します。

pathman /as %M2%

たとえば、%M2%をシステムパスに追加します。これ以上でもそれ以下でもありません。ユーザーPATHとシステムPATHの混合を取得するのに問題はもうありません。レジストリから正しい値を取得しようとすることはもうほとんどありません...

Windows 10で試した

3
Shivan

%PATH%環境変数が1024文字に近づき、それを修正するためにPowershellスクリプトを作成したときに、コンピューターラボの管理でこのような問題が発生していました。

ここからコードをダウンロードできます: https://gallery.technet.Microsoft.com/scriptcenter/Edit-and-shorten-PATH-37ef3189

PATHエントリを安全に追加、削除、解析する簡単な方法として使用することもできます。楽しい。

0
Carl Bennett

手順:1。管理者権限でコマンドプロンプトを開きます。

手順:2。コマンドを実行します:setx/M PATH "path\to;%PATH%"

[注:path\toがルートからのフォルダーパスを反映するように、コマンドを必ず変更してください。]

:setx/M PATH "C:\ Program Files;%PATH%"

0
Raj Tukadiya