web-dev-qa-db-ja.com

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

次のように、 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文字に切り捨てられます。

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

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

69
Madhur Ahuja

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

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

ただし、非常に長いパスを入力することはできますが、(最大環境変数長まで。 2,048 または ソースによっては32,768 バイトになりますが、長すぎると、すべてのソフトウェアで正しく読み取って処理できるとは限りません。

46
Synetech

windows Vista以降を使用している場合は、フォルダにsymbolic linkを付けることができます。例えば:

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

c:\pfがあなたのプログラムファイルフォルダーになるようにリンクを張るでしょう。私はこのトリックを使って自分のパスから300文字を削りました。

(私はそれがsetxとは無関係であることを知っていますが、それは1024文字の制限を超えて検索しすぎている人々にとって有用です)

28
RezaRahmati

次のような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 をブロードキャストするので、再起動する必要はありません。

17
Justin Dearing

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

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

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

7

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

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

4
Justin Dearing

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

2
Andrew Steitz

この行をBATに入れることができます。

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

二重の%%を見てください。

(参考: https://support.Microsoft.com/ja-jp/kb/75634

私は最善の方法は次のことだと思います(パワーシェル付き)この方法でもあなたは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
0
Drazul

システム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
0
fantastory