windows - विंडोज पावरशेल पथ चर सेट करना




powershell (8)

PowerShell प्रॉम्प्ट से:

setx PATH "$env:path;\the\directory\to\add" -m

आपको तब टेक्स्ट देखना चाहिए:

SUCCESS: Specified value was saved.

अपने सत्र को पुनरारंभ करें, और चर उपलब्ध होगा। setx उपयोग मनमाने ढंग से चर सेट करने के लिए भी किया जा सकता है। setx /? टाइप करें setx /? प्रलेखन के लिए संकेत पर।

इस तरह से अपने रास्ते से गड़बड़ करने से पहले, सुनिश्चित करें कि आप $env:path >> a.out प्रॉम्प्ट में $env:path >> a.out करके अपने मौजूदा पथ की प्रति सहेज लें।

मुझे पता चला है कि पाथ पर्यावरण चर सेट करने से केवल पुराने कमांड प्रॉम्प्ट को प्रभावित किया जाता है। पावरशेल में विभिन्न पर्यावरण सेटिंग्स हैं। मैं PowerShell (v1) के लिए पर्यावरण चर कैसे बदलूं?

ध्यान दें:

मैं अपने परिवर्तन स्थायी बनाना चाहता हूं, इसलिए जब भी मैं पावरशेल चलाता हूं तो मुझे इसे सेट करने की आवश्यकता नहीं होती है। क्या PowerShell प्रोफाइल फ़ाइल है? यूनिक्स पर बैश प्रोफाइल की तरह कुछ?


अधिकांश उत्तर UAC को संबोधित नहीं कर रहे हैं। इसमें यूएसी मुद्दे शामिल हैं।

सबसे पहले PowerShell समुदाय एक्सटेंशन choco install pscx : choco install pscx http://chocolatey.org/ माध्यम से choco install pscx (आपको अपने खोल वातावरण को पुनरारंभ करना पड़ सकता है)।

फिर पीएससीएक्स सक्षम करें

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser #allows scripts to run from the interwebs, such as pcsx

फिर Invoke-Elevated उपयोग करें

Invoke-Elevated {Add-PathVariable $args[0] -Target Machine} -ArgumentList $MY_NEW_DIR

जैसा कि here जोनाथन नेताओं ने उल्लेख किया here , 'मशीन' के लिए पर्यावरण चर बदलने में सक्षम होने के लिए ऊंचा कमांड / स्क्रिप्ट चलाने के लिए महत्वपूर्ण है, लेकिन कुछ कमांड चलाकर समुदाय एक्सटेंशन के साथ नहीं किया जाना चाहिए, इसलिए मुझे पसंद है share को एक तरीके से संशोधित और विस्तारित करने के लिए, कि मशीन चर बदलना भी किया जा सकता है भले ही स्क्रिप्ट स्वयं ऊंचा नहीं हो:

function Set-Path ([string]$newPath, [bool]$permanent=$false, [bool]$forMachine=$false )
{
    $Env:Path += ";$newPath"

    $scope = if ($forMachine) { 'Machine' } else { 'User' }

    if ($permanent)
    {
        $command = "[Environment]::SetEnvironmentVariable('PATH', $env:Path, $scope)"
        Start-Process -FilePath powershell.exe -ArgumentList "-noprofile -command $Command" -Verb runas
    }

}

मेरा सुझाव यह है कि मैंने इसे सी: \ oracle \ x64 \ bin को पथ में स्थायी रूप से जोड़ने के लिए परीक्षण किया है और यह ठीक काम करता है।

$ENV:PATH

पहला तरीका बस करना है:

$ENV:PATH=”$ENV:PATH;c:\path\to\folder”

लेकिन यह परिवर्तन अनिवार्य रूप से नहीं है, $ env: जैसे ही आप अपने पावरहेल टर्मिनल को बंद करते हैं और फिर से इसे फिर से खोलते हैं, पथ पहले से ही डिफ़ॉल्ट हो जाएगा। ऐसा इसलिए है क्योंकि आपने सत्र स्तर पर परिवर्तन लागू किया है न कि स्रोत स्तर पर (जो रजिस्ट्री स्तर है)। $ Env का वैश्विक मान देखने के लिए: पथ, करें:

Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH

या, अधिक विशेष रूप से:

(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path

अब इसे बदलने के लिए, पहले हम मूल पथ को कैप्चर करते हैं जिसे संशोधित करने की आवश्यकता है:

$oldpath = (Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path

अब हम परिभाषित करते हैं कि नया पथ कैसा दिखना चाहिए, इस मामले में हम एक नया फ़ोल्डर जोड़ रहे हैं:

$newpath = “$oldpath;c:\path\to\folder”

नोट: सुनिश्चित करें कि $ newpath दिखता है कि आप इसे कैसे देखना चाहते हैं, यदि नहीं तो आप अपने ओएस को नुकसान पहुंचा सकते हैं।

अब नया मान लागू करें:

Set-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH -Value $newPath

अब एक अंतिम जांच करें कि ऐसा लगता है कि आप इसकी अपेक्षा कैसे करते हैं:

Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Contro
l\Session Manager\Environment’ -Name PATH).Path

अब आप अपने पावरहेल टर्मिनल (या यहां तक ​​कि रीबूट मशीन) को पुनरारंभ कर सकते हैं और देख सकते हैं कि यह फिर से पुराने मान पर रोलबैक नहीं करता है। ध्यान दें कि पथों का क्रम बदल सकता है ताकि यह वर्णानुक्रम में हो, इसलिए सुनिश्चित करें कि आप इसे आसान बनाने के लिए पूरी लाइन को जांचें, आप अर्ध-कोलन को एक डिलीमीटर के रूप में उपयोग करके पंक्तियों में विभाजित कर सकते हैं:

($env:path).split(“;”)

यद्यपि वर्तमान स्वीकृत उत्तर इस अर्थ में काम करता है कि पथ चर PowerShell के संदर्भ से स्थायी रूप से अद्यतन हो जाता है, यह वास्तव में विंडोज रजिस्ट्री में संग्रहीत पर्यावरण चर अद्यतन नहीं करता है। यह प्राप्त करने के लिए कि आप निश्चित रूप से PowerShell का भी उपयोग कर सकते हैं:

$oldPath=(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).Path

$newPath=$oldPath+’;C:\NewFolderToAddToTheList\’

Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH –Value $newPath

यहां अधिक जानकारी: http://blogs.technet.com/b/heyscriptingguy/archive/2011/07/23/use-powershell-to-modify-your-environmental-path.aspx

यदि आप PowerShell समुदाय एक्सटेंशन का उपयोग करते हैं, तो पर्यावरण चर पथ के लिए पथ जोड़ने के लिए उचित आदेश है:

Add-PathVariable "C:\NewFolderToAddToTheList" -Target Machine

यह वर्तमान सत्र के लिए पथ सेट करता है और उपयोगकर्ता को इसे स्थायी रूप से जोड़ने के लिए संकेत देता है:

function Set-Path {
    param([string]$x)
    $Env:Path+= ";" +  $x
    Write-Output $Env:Path
    $write = Read-Host 'Set PATH permanently ? (yes|no)'
    if ($write -eq "yes")
    {
        [Environment]::SetEnvironmentVariable("Path",$env:Path, [System.EnvironmentVariableTarget]::User)
        Write-Output 'PATH updated'
    }
}

आप इस फ़ंक्शन को अपनी डिफ़ॉल्ट प्रोफ़ाइल में जोड़ सकते हैं, ( Microsoft.PowerShell_profile.ps1 ), आमतौर पर %USERPROFILE%\Documents\WindowsPowerShell पर स्थित है।


स्थायी परिवर्तन का सुझाव देने वाले सभी उत्तरों में एक ही समस्या है: वे पथ रजिस्ट्री मान तोड़ते हैं।

SetEnvironmentVariable REG_EXPAND_SZ मान %SystemRoot%\system32 को C:\Windows\system32 REG_SZ मान में बदल देता C:\Windows\system32

पथ में किसी भी अन्य चर भी खो गए हैं। %myNewPath% का उपयोग करके नए जोड़ना अब और काम नहीं करेगा।

यहां एक स्क्रिप्ट Set-PathVariable.ps1 जिसका उपयोग मैं इस समस्या को हल करने के लिए करता हूं:

 [CmdletBinding(SupportsShouldProcess=$true)]
 param(
     [parameter(Mandatory=$true)]
     [string]$NewLocation)

 Begin
 {

 #requires –runasadministrator

     $regPath = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
     $hklm = [Microsoft.Win32.Registry]::LocalMachine

     Function GetOldPath()
     {
         $regKey = $hklm.OpenSubKey($regPath, $FALSE)
         $envpath = $regKey.GetValue("Path", "", [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)
         return $envPath
     }
 }

 Process
 {
     # Win32API error codes
     $ERROR_SUCCESS = 0
     $ERROR_DUP_NAME = 34
     $ERROR_INVALID_DATA = 13

     $NewLocation = $NewLocation.Trim();

     If ($NewLocation -eq "" -or $NewLocation -eq $null)
     {
         Exit $ERROR_INVALID_DATA
     }

     [string]$oldPath = GetOldPath
     Write-Verbose "Old Path: $oldPath"

     # Check whether the new location is already in the path
     $parts = $oldPath.split(";")
     If ($parts -contains $NewLocation)
     {
         Write-Warning "The new location is already in the path"
         Exit $ERROR_DUP_NAME
     }

     # Build the new path, make sure we don't have double semicolons
     $newPath = $oldPath + ";" + $NewLocation
     $newPath = $newPath -replace ";;",""

     if ($pscmdlet.ShouldProcess("%Path%", "Add $NewLocation")){

         # Add to the current session
         $env:path += ";$NewLocation"

         # Save into registry
         $regKey = $hklm.OpenSubKey($regPath, $True)
         $regKey.SetValue("Path", $newPath, [Microsoft.Win32.RegistryValueKind]::ExpandString)
         Write-Output "The operation completed successfully."
     }

     Exit $ERROR_SUCCESS
 }

मैं ब्लॉग पोस्ट में अधिक विस्तार से समस्या की व्याख्या करता हूं।


@ माइकल क्रोपैट के उत्तर पर बिल्डिंग मैंने मौजूदा PATH चर के नए पथ को प्रीपेन्ड करने के लिए पैरामीटर जोड़ा और एक गैर-मौजूदा पथ को जोड़ने से बचने के लिए एक चेक जोड़ा:

function Add-EnvPath {
    param(
        [Parameter(Mandatory=$true)]
        [string] $Path,

        [ValidateSet('Machine', 'User', 'Session')]
        [string] $Container = 'Session',

        [Parameter(Mandatory=$False)]
        [Switch] $Prepend
    )

    if (Test-Path -path "$Path") {
        if ($Container -ne 'Session') {
            $containerMapping = @{
                Machine = [EnvironmentVariableTarget]::Machine
                User = [EnvironmentVariableTarget]::User
            }
            $containerType = $containerMapping[$Container]

            $persistedPaths = [Environment]::GetEnvironmentVariable('Path', $containerType) -split ';'
            if ($persistedPaths -notcontains $Path) {
                if ($Prepend) {
                    $persistedPaths = ,$Path + $persistedPaths | where { $_ }
                    [Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
                }
                else {
                    $persistedPaths = $persistedPaths + $Path | where { $_ }
                    [Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
                }
            }
        }

        $envPaths = $env:Path -split ';'
        if ($envPaths -notcontains $Path) {
            if ($Prepend) {
                $envPaths = ,$Path + $envPaths | where { $_ }
                $env:Path = $envPaths -join ';'
            }
            else {
                $envPaths = $envPaths + $Path | where { $_ }
                $env:Path = $envPaths -join ';'
            }
        }
    }
}




powershell