29

以下のコマンドを試して、バッチファイルでシステムパス変数にパスを追加しました:

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

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

ここに画像の説明を入力

以下のすべてのウィンドウ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;

私は何を間違っていますか?

4

7 に答える 7

32

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

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

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

setx.exe は、ところで /M の配置にうるさいです。それは最後にある必要があります。

于 2013-06-22T04:18:00.627 に答える
16

警告!

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」を追加したい場合を処理します。

これにより、パス内の値が展開され、展開された状態で保存されることに注意してください。これを避けたい場合は、以下の @ErykSun のコメントをご覧ください。

$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');
于 2016-05-18T16:00:10.903 に答える
6

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

ここに画像の説明を入力

于 2013-06-21T18:57:50.800 に答える
4

前述のように、パスは 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)}"
于 2017-01-25T11:31:37.043 に答える