web-dev-qa-db-ja.com

SETXはシステムパス変数にパスを追加しません

私はバッチファイルによってシステムパス変数にいくつかのパスを追加するコマンドを試してみました:

setx PATH "%PATH%;C:\Program Files\MySQL\MySQL Server 5.5\bin"

上記のバッチファイルを実行した後、システム変数のパスを確認しましたが、上記のパスはそこにありません。

enter image description here

すべてのウィンドウを見ることができますVariable value以下のコンテンツ:

C:\Program Files (x86)\AMD APP\bin\x86_64;C:\Program Files (x86)\AMDAPP\bin\x86;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\ProgramFiles (x86)\ATI Technologies\ATI.ACE\Core-Static;

何が間違っていますか?

21
Hamed Kamrava

@Endoroの回答に便乗するには(コメントする担当者がいません):

システム全体の環境変数を変更する場合は、/ Mを使用する必要があります。

setx PATH "%PATH%;C:\Program Files\MySQL\MySQL Server 5.5\bin" /M

setx.exeは、/ M、BTWの配置について気難しいです。最後にある必要があります。

29
mojo

警告!

setxは、値を1024文字に切り捨てます。

PATHの変更に使用すると、システムが台無しになる可能性があります。

このPowerShellスニペットを使用して、パスに何かを追加できます。

$new_entry = 'c:\blah'

$old_path = [Environment]::GetEnvironmentVariable('path', 'machine');
$new_path = $old_path + ';' + $new_entry
[Environment]::SetEnvironmentVariable('path', $new_path,'Machine');

既存のエントリを再度追加したくない場合は、次のようにします(より良いバージョンについては、以下を参照してください):

$new_entry = 'c:\blah'
$search_pattern = ';' + $new_entry.Replace("\","\\")

$old_path = [Environment]::GetEnvironmentVariable('path', 'machine');
$replace_string = ''
$without_entry_path = $old_path -replace $search_pattern, $replace_string
$new_path = $without_entry_path + ';' + $new_entry
[Environment]::SetEnvironmentVariable('path', $new_path,'Machine');

ここで私が現在使用している新しいバージョン(2017-10-23)。このバージョンは、ネストされたパスを正しく処理します。例えば。 「c:\ tool\foo」を含むPATHのケースを処理し、「c:\ tool」を追加します。

$desired_entry = 'C:\test'

$old_path = [Environment]::GetEnvironmentVariable('path', 'machine');

$old_path_entry_list = ($old_path).split(";")
$new_path_entry_list = new-object system.collections.arraylist

foreach($old_path_entry in $old_path_entry_list) {
    if($old_path_entry -eq $desired_entry){
        # ignore old entry
    }else{
        [void]$new_path_entry_list.Add($old_path_entry)
    }
}
[void]$new_path_entry_list.Add($desired_entry)
$new_path = $new_path_entry_list -Join ";"

[Environment]::SetEnvironmentVariable('path', $new_path,'Machine');
9
Robert Fey

システム環境変数ではなく、ユーザー環境変数を確認する必要があります。

enter image description here

6
Endoro
SETX /M Path "%PATH%;%ProgramFiles%\MySQL\MySQL Server 5.5\bin\

システム変数にパスを追加します

5
chiragchavda.ks

前述のように、1024文字に制限されているため、パスにsetxを使用しないでください。

Reg addを使用できます:

set pathkey="HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment"
for /F "usebackq skip=2 tokens=2*" %%A IN (`reg query %pathkey% /v Path`) do (reg add %pathkey% /f /v Path /t REG_SZ /d "%%B;C:\Program Files\MySQL\MySQL Server 5.5\bin")

または、ユーザーパスにpathkey = "HKEY_CURRENT_USER\Environment"を設定します。

次に、変更をブロードキャストします。

powershell -command "& {$md=\"[DllImport(`\"user32.dll\"\",SetLastError=true,CharSet=CharSet.Auto)]public static extern IntPtr SendMessageTimeout(IntPtr hWnd,uint Msg,UIntPtr wParam,string lParam,uint fuFlags,uint uTimeout,out UIntPtr lpdwResult);\"; $sm=Add-Type -MemberDefinition $md -Name NativeMethods -Namespace Win32 -PassThru;$result=[uintptr]::zero;$sm::SendMessageTimeout(0xffff,0x001A,[uintptr]::Zero,\"Environment\",2,5000,[ref]$result)}"
3
colin lamarre

Fortran(Eclipse for c/c ++/fortran)に関連するパス変数を追加しようとしたときに同じ問題に直面しました

管理者としてコマンドプロンプトでSETX/Mパス "%PATH%; C:\ Users\mahidhai\cygwin64\bin"を試しました。データが1024文字に切り捨てられて保存されたという警告が表示されました。

解決策:レジストリファイルに直接移動します。 Run-> regedit環境に移動

(パス全体:HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment)

パスレジストリをクリックして、パス変数を直接追加します。または、繰り返されるパス変数を削除します。

次に、コマンドプロンプトを開き、同じコマンドsetx/M path "%path%、"を実行します

パス変数はCまたはC++またはfortranに関連している可能性があります

レジストリファイルの編集に心配はありません、それは永久に保存されます、環境変数がセッションマネージャーにあるので恐れてはいけません。

0
V SAI MAHIDHAR