windows 7 – setx で 1024 文字制限を克服する

environment-variables windows-7 windows-server-2008-r2

以下のように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\m32\bin;F:\BorlandBCC55\Bin;%PATH%”

しかし、値が1024文字以上になると以下のようなエラーが出ます

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

SUCCESS(成功)です。指定した値が保存されました

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

  82  Madhur Ahuja  2012-02-08


ベストアンサー

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

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

しかし、非常に長いパスを入力することができますが(2,048 または 32,768 バイト(ソースによって異なります)、長すぎるとすべてのソフトウェアがそれを読み取って正しく処理できるとは限らないことに注意してください

53  Synetech  2012-02-08


windows vista 以上を使用している場合は、フォルダに symbolic link を作成することができます

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

とすると、c:\pfがプログラムファイルのフォルダになるようにリンクが張られます。このトリックを使って、パスから300文字削ってみました

(setxとは関係ないとは思いますが、1024文字制限でオーバーコミングで検索している人には便利です)

34  Reza  2014-09-11


以下のような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('PATH', "$newPath;$oldPath",'Machine');

Environment.SetEnvironmentVariable() APIコールはWM_SETTINGCHANGEをブロードキャストするので、再起動の必要はありません

22  Justin Dearing  2012-04-09


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

SetEnv
A free tool for setting/updating/deleting System Environment Variables.

変数に追加するプレフィックスとして % を選択すると、他のバッチローカル変数と一緒に使用した場合に構文が難しくなることがあるので、もっと良い方法があったかもしれません

7  Kharlos Dominguez  2012-06-14


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

setxよりも優れたユーザーエクスペリエンスに加え、1024文字の制限がありません。直接のレジストリ操作とは異なり、このアプリケーションではEnvironment.SetEnvironmentVariable() API call which will broadcast WM_SETTINGCHANGEを使用します

4  Justin Dearing  2012-04-09


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

2  Andrew Steitz  2015-12-09


このセリフをBATに入れることができます

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

ダブル%%を参照してください

(参考にしてください。https://support.microsoft.com/en-us/kb/75634)。)

2  Aminadav Glickshtein  2015-04-21


システムの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  2014-10-24


(powerershellを使った)次の方法が一番良いと思います

でコードを見ることができます。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  2016-02-04


タイトルとURLをコピーしました