setxで1024文字の制限を克服する


74

setx次のようなコマンドを使用して環境変数を設定しようとしています

setx PATH "f:\ common tools \ git \ bin; f:\ common tools \ python \ app; f:\ common tools \ python \ app \ scripts; f:\ common tools \ ruby​​ \ bin; f:\ masm32 \ bin; F:\ Borland \ BCC55 \ Bin;%PATH% "

ただし、値の長さが1024文字を超えると、次のエラーが表示されます。

警告:保存されるデータは1024文字に切り捨てられます。

成功:指定された値が保存されました。

しかし、最後のパスの一部は変数に保存されていません。エラーが示唆するように、文字数の制限のためだと思います。


編集する代替方法のリストがあります%PATH%superuser.com/questions/297947は
Ehteshチョードリー

1
見て急速な環境のエディタあなたは(あなたも、バックアップを保存することができます)グラフィカルにすべてenvirnoment変数を編集することができます。
ja72 16

3
他の誰かが、要求されたものを明らかに実行しないのに、この成功を主張することに悩まされていますか?パスをそのままにしておいても、これが失敗しないことは問題ではありませんか?
チャドショーギンズ

これはまだWindows 10で切り捨てられますか?
カウリネーター

1
はい、Windows 10で動作します
イヴァン

回答:


48

最善の策は、レジストリを直接編集することです。

値に移動しHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environmentて編集しPathます(その後、再起動して新しい値を有効にします)。

ただし、非常に長いパス(環境変数の最大長まで、ソースに応じて2,048または32,768バイト)を入力できますが、すべてのソフトウェアが長すぎる場合にそれを正しく読み取って処理できるわけではないことに注意してください。


1
ここで再起動は本当に必要ですか?setxはどのようにそれを行いますか?Setxは再起動を必要としません。
マドゥールアフジャ

11
はい、再起動が必要です。setx私が示したようにレジストリを編集し、WM_SETTINGCHANGEメッセージをブロードキャストします。これにより、すべてのトップレベルウィンドウに、システム設定(この場合は環境変数)が変更されたことが通知されます。これがないと、Explorerとそれを使用して開いたプログラムは変更を認識しません。メッセージを自分で手動でブロードキャストすることもできます(それを行うプログラムとSETX、レジストリを編集してブロードキャストするバッチファイルを作成しました)がsetx、システムプロパティenvvarダイアログと同様に、副作用がありますリブートを推奨します。
Synetech

2
ああ、env.varを編集します。他の変数を含む環境変数は展開が停止するため、再起動しないと実際に問題が発生します。たとえば、私はそれをただブロードキャストしましたが、今ではこれが私のパスになり、パスが「壊れた」/空になっているためエラーが発生します。再起動するまで、どの変数も再び適切に拡張しません。残念ながら、これは「正常」です。:-|
Synetech

3
WM_SETTINGCHANGEメッセージをブロードキャストする小さなPowerShellスクリプトを見つけました。
ジャスティンディアリング

10
REG addコマンドで上記のレジストリメソッドを使用し、SETXを使用して他の変数をそれ自体に設定できます(つまり、SETX / M USERNAME%USERNAME%)。これにより、WM_SETTINGCHANGEメッセージが設定され、バッチファイルからパスを設定できるようになります。
アート

30

Windows Vista以降を使用している場合はsymbolic link、フォルダを作成できます。例えば:

mklink /d C:\pf "C:\Program Files"
mklink /d C:\pf86 "C:\Program Files (x86)"

リンクが作成されるのでc:\pf、プログラムファイルフォルダも作成されます。このトリックを使用して、パスから300文字を削除しました。

(私はそれがsetxに関連していないことを知っていますが、1024文字の制限を超えて検索している人々には便利です)


18

次のようなPowerShellスクリプトを使用できます。

$newPath = 'f:\common tools\git\bin;f:\common tools\python\app;f:\common tools\python\app\scripts;f:\common tools\ruby\bin;f:\masm32\bin;F:\Borland\BCC55\Bin'
$oldPath = [Environment]::GetEnvironmentVariable('path', 'machine');
[Environment]::SetEnvironmentVariable('path2', "$($newPath);$($oldPath)",'Machine');

Environment.SetEnvironmentVariable() API呼び出しが放送されますWM_SETTINGCHANGEので、再起動する必要はありません。


次の行も必要ではありませんか:[Environment] :: SetEnvironmentVariable( 'path'、 "$ newPath"、 'Machine');
ヒョードルスティーマン

1
3行目では、余分なドル記号と括弧がもたらす利点がわからない。ただ言っていただけません[Environment]::SetEnvironmentVariable('path', "$newPath;$oldPath",'Machine')か?
twasbrillig

1
@twasbrillig変数に文字列を含めるときは注意が必要です。この場合、その必要はありません。
ジャスティンディアリング

3
あなたは、管理者コマンドプロンプトからこれを呼び出すことができます@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -ExecutionPolicy Bypass -Command "[Environment]::SetEnvironmentVariable('path',\"C:\Program Files (x86)\GNU\GnuPG;$([Environment]::GetEnvironmentVariable('path','Machine'))\",'Machine');"
マーク・C

7

このオープンソースのSetEnvコマンドラインツールは、PATHおよびその他の環境変数を制限なしに編集するのに適しています。動的バッファを使用するため、1024のような静的な制限はありません。

http://www.codeproject.com/Articles/12153/SetEnv

ただし、変数に追加する接頭辞として%を選択する方が良いかもしれません。他のバッチローカル変数で使用すると構文が難しくなることがあるためです...


> SetEnvツールは、Indeedを使用せずにPATHおよびその他の環境変数を編集するのに適しています 。実際、私は個人的にそのページでDarkaと協力してSetEnvをさらに改善し、拡張/サブ変数(動的変数拡張セクション)を完全にサポートできるようにしました。これは実際に生のパスの長さを短縮するのに役立ちます。
Synetech

4

パス操作用のsetxよりもはるかに優れたツールはpathed.exeです。残念ながら、パスの編集に制限されています。

setxよりも優れたユーザーエクスペリエンスに加えて、1024文字の制限はありません。直接のレジストリ操作とは異なり、このアプリケーションは、ブロードキャストするEnvironment.SetEnvironmentVariable() API呼び出しを使用しますWM_SETTINGCHANGE


2
superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7で(pathed.exeを含む)その他のツールのリストがあります
Ehteshチョードリー


2

私のお気に入りの方法は、8.3変数を使用するようにPATH変数のフォルダー名を変更することです。 このStackOverflowの回答には、PATH変数全体の「縮小」バージョンを生成するすばらしいスクリプト(.batファイルから実行)があり、これを[変数の編集]ダイアログに貼り付けることができます。唯一の注意点は、SYSTEM部分とUSER部分を分割する必要があることです。スクリプトが実行され、各フォルダーの縮小バージョンが把握されると、無効なパスや存在しないパスがあれば破棄され、警告が表示されます。ナイスリトルクリーンアップボーナス。


使用した場合は注意してくださいfsutil.exe behavior set disable8dot3 1
アンドリューモートン

@AndrewMortonの良い点ですが、スクリプトが8.3名を「生成」せず、ファイルシステムが割り当てた8.3名を報告するという事実によって「処理」されないでしょうか。そのため、フォルダーに8.3名がない場合、スクリプトは代替を提案しません。ただし、fsutil 8dot3name stripスクリプトを使用してAFTERを使用すると、影響を受けるフォルダーに問題が必ず発生します。
アンドリューシュタイツ

残念ながら、チェックするスペアドライブまたはシステムはありません。ただし、fsutil 8dot3name strip今日以前にいくつかを使用し、(a)レジストリを最初にチェックし、(b)パスがレジストリに保存されていることを考慮すると、ユーザーが/f(force)オプションを使用しない限り、私の以前の懸念は正当ではない可能性があります。
アンドリューモートン

2

BATに次の行を追加できます。

setx path "%%path%%;c:\drive\fr;c:\drive\installs\7z"

doubleを参照してください%%

(参照:https : //support.microsoft.com/en-us/kb/75634


リンクが現在切断されています
イヴァン

1
警告!これはおそらく物事を壊し%path%;c:\...[snip]...\7z、ユーザーpath変数に書き込み、そこにあった他のものをすべてドロップします。
ユージンペトロフ

プログラムが使用するPATH環境変数は、マシン変数とローカルPATH変数の組み合わせです。ローカルパスの現在のデータを破壊することに加えて、これは何もしないと思います。持つ%path%ローカルパス環境変数にしても効果はないはずです。
アナン

0

システムPATHとユーザーPATHを別々に保つ必要がない場合:

::setx /m truncate variable length to 1024 REG ADD 
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH /t REG_SZ /f /d "%PATH%"
::empty local path, use system wide only, else it will enlarge with every setx /m
setx PATH ""
::setx is dummy but propagate system wide variables with it
setx /m A A

1
ここで提案していることについてもう少し説明できますか?
Gマン

setx 1024文字の制限を回避するための、すぐに使用できるコマンドです。例は、PATH変数に直接示されています。前の回答は役に立ちましたが、最終的な解決策がありません。
空想14年

0

最善の方法は次の方法(powershellを使用)であると思います。この方法でも、1024文字のリミットを回避できます。

コードはhttps://gist.github.com/drazul/b92f780689bd89a0d2a7で見ることができます

#------------ Add path to system variable -------------------------------------

$path2add = ';C:\path;'
$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');

If (!$systemPath.contains($path2add)) {
    $systemPath += $path2add
    $systemPath = $systemPath -join ';'
    [Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');
    write-host "Added to path!"
    write-host $systemPath
}

#------------ Delete path from system variable --------------------------------

$path2delete = 'C:\path;'
$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');

$systemPath = $systemPath.replace($path2delete, '')
$systemPath = $systemPath -join ';'

[Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');

write-host "Deleted from path!"
write-host $systemPath

#------------ Clean system variable -------------------------------------------

$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');

while ($systemPath.contains(';;')) {
    $systemPath = $systemPath.replace(';;', ';')
}

[Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');

write-host "Cleaned path!"
write-host $systemPath
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.