Windows PowerShell वातावरण चर सेट करना


605

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

ध्यान दें:

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


1
मैं एक फ़ाइल साझा पर स्थित एक केंद्रीय प्रोफ़ाइल रखना चाहूंगा। सिंक्रनाइज़ेशन एक दर्द है। के साथ एक स्टब प्रोफाइल बनाना। \\ कंप्यूटर \ share \ path \ Profile.ps1 एक कीचड़ की तरह लगता है (नोटपैड $ प्रोफ़ाइल का प्रयास करें)। यह अच्छा होगा यदि $ प्रोफ़ाइल स्वचालित चर को स्थायी रूप से बदलने का एक तरीका था।
नाथन हार्टले

5
कोई भी PATH वातावरण शक्तियाँ कमांड प्रॉम्प्ट को भी प्रभावित नहीं करता है । हालांकि अलग क्या है कि शक्तियां उद्धरणों में संलग्न रास्तों को स्वीकार नहीं करती हैं। समाधान: "पथ पर्यावरण चर में सभी संलग्न उद्धरण ( ) को हटा दें
Nilzor

3
यदि आप पीएस के लिए यहां जाते हैं> v1 ... आगे निलज़ोर की टिप्पणी के लिए: अपने सत्र के लिए $($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
पैठ

जवाबों:


476

env: namespace / driveजानकारी का उपयोग करके वास्तविक पर्यावरण चर को बदला जा सकता है । उदाहरण के लिए, यह कोड पथ पर्यावरण चर को अद्यतन करेगा:

$env:Path = "SomeRandomPath";             (replaces existing path) 
$env:Path += ";SomeRandomPath"            (appends to existing path)

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

C:\Users\JaredPar\Documents\WindowsPowerShell\profile.ps1

38
$ प्रोफ़ाइल एक स्वचालित चर है जो सभी PowerShell होस्ट के लिए आपके उपयोगकर्ता प्रोफ़ाइल पर इंगित करता है।
जेसनम्रेचर

16
ध्यान दें कि (विभाजित-पथ $ प्रोफ़ाइल) (युक्त फ़ोल्डर प्राप्त करने के लिए) में एकाधिक प्रोफ़ाइल फ़ाइलें हो सकती हैं: profile.ps1 को सभी होस्ट द्वारा लोड किया जाना चाहिए, <host-name> _profile.ps1 केवल निर्दिष्ट होस्ट द्वारा। PowerShell.exe (कंसोल होस्ट) के लिए, यह Microsoft.PowerShell_profile.ps1 है।
रिचर्ड

10
क्या होगा यदि मेरे पास मेरे दस्तावेज़ों में एक फ़ोल्डर WindowsPowerShell नहीं है? क्या मुझे फ़ोल्डर और फ़ाइल बनाना चाहिए? अगर मुझे C:\path\to\file.extपर्यावरण चर में जोड़ना है तो मुझे फ़ाइल में क्या डालना चाहिए ? संपादित करें: यह पहले से ही पाया। उत्तर हां है, इसे बनाएं। फ़ाइल में 1 पंक्ति होनी चाहिए $env:path += ;C:\path\to\file.ext":।
लेविस्ट्रिक

7
@Lewistrick आपके पास डिफ़ॉल्ट रूप से एक प्रोफ़ाइल नहीं है। मैंने एक बनाने के इन निर्देशों का पालन किया: howtogeek.com/50236/customizing-your-powershell-profile
MikeB

16
ऐसा करने में सावधानी बरतें - यह आपके मौजूदा रास्ते को बंद कर देगा। $env:Path = "SomeRandomPath"; इसके बजाय - नीचे @mloskot देखें।
जॉन मार्क

626

यदि, PowerShell सत्र के दौरान कुछ समय, आपको अस्थायी रूप से PATH पर्यावरण चर में संलग्न करने की आवश्यकता है, तो आप इस तरह से कर सकते हैं:

$env:Path += ";C:\Program Files\GnuWin32\bin"

4
+1 :: यह वन-लाइनर सत्र-आधारित इनवोकेशन के लिए काफी प्रभावी है जैसा कि mingw ... IE $ env: PATH + = "; c: \ MinGW \ msys \ 1.0 \ bin" ^ {कुछ मिंगव बिन ... }
एडी बी '

2
और मैं एक रास्ता कैसे निकालूं?
14

11
यदि आपको मानक एक से पहले कॉल करने के लिए आपके रास्ते की आवश्यकता है, तो इसे शुरुआत में डालें $env:Path = "C:\MyPath;$env:Path"
माइकल फ्रीजिम

4
**** एपिकिंग स्ट्रिंग की शुरुआत में अर्धविराम को न भूलें, जैसा कि @ केविन की टिप्पणी में देखा गया है। यह बहुत स्पष्ट है, लेकिन याद किया जा सकता है यदि आप बस उत्तर में कोड को कॉपी / पेस्ट करते हैं और मौजूदा पथ के अंत में अर्धविराम नहीं है। मैं एक संपादन प्रस्तुत करने की कोशिश करूँगा।
मैट गुडरिच

1
पिछले पुनरीक्षण में @MattGoodrich मैंने रोलबैक
कोयूर

278

आप निम्नलिखित के साथ उपयोगकर्ता / सिस्टम पर्यावरण चर को स्थायी रूप से संशोधित कर सकते हैं (यानी शेल पुनरारंभ के दौरान लगातार रहेगा):

सिस्टम वातावरण चर को संशोधित करें

[Environment]::SetEnvironmentVariable
     ("Path", $env:Path, [System.EnvironmentVariableTarget]::Machine)

उपयोगकर्ता पर्यावरण चर को संशोधित करें

[Environment]::SetEnvironmentVariable
     ("INCLUDE", $env:INCLUDE, [System.EnvironmentVariableTarget]::User)

टिप्पणियों से उपयोग - सिस्टम पर्यावरण चर में जोड़ें

[Environment]::SetEnvironmentVariable(
    "Path",
    [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + ";C:\bin",
    [EnvironmentVariableTarget]::Machine)

यदि आप लिखना नहीं चाहते हैं तो स्ट्रिंग आधारित समाधान भी संभव है

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", "Machine")

6
यह प्रतिबंधित एक्सेस सिस्टम के लिए बहुत उपयोगी है।
h0tw1r3

14
@AndresRiofrio, हाँ, यह स्थायी है। उपयोग: [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine) आप इस परिवर्तन का परिणाम तब तक नहीं देखेंगे जब तक कि आप एक नया शक्तियां सत्र शुरू नहीं करते। यही है, अगर आप $ env का निरीक्षण करते हैं: इस कमांड को चलाने के तुरंत बाद, आप देखेंगे कि क्या $ env: Path कमांड से पहले था। अद्यतन करने के लिए, खोल को बंद करें और खोलें या एक नया सत्र शुरू करें।
FLGMwt

7
@FLGMwt आपके पास एक टाइपो है, सही है: [पर्यावरण] :: SetEnvironmentVariable ("पथ", $ env: Path + "; C: \ bin", [EnvironmentVariableTarget] :: मशीन
उत्साह

10
आप पूरे .NET एनम के बजाय स्ट्रिंग "मशीन" या "उपयोगकर्ता" लिख सकते हैं। से टेकनेट
बुविविर

3
मुझे लगता है कि उत्तर को भी उपयोगकर्ता चर सेट करने के लिए उपयोग प्रदर्शित करना चाहिए, जैसे[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
सैटो

63

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

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

फिर आपको पाठ देखना चाहिए:

SUCCESS: Specified value was saved.

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

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


5
केवल तब चलता है जब 'व्यवस्थापक के रूप में चल रहा है', और उसके बाद केवल 'व्यवस्थापक के रूप में चलने' के लिए प्रभावी होता है PowerShell कंसोल, नियमित रूप से चलने वाले नहीं।
गणितज्ञ


12
आउच - बस सेटेक्स की 1024 चरित्र सीमा से हिट हो गया; शुक्र है कि मैंने $ अंत के मौजूदा मूल्य को रिकॉर्ड करने के लिए सलाह का पालन किया: पथ। बस ऐसा कुछ जिसके बारे में अवगत होना चाहिए: superuser.com/questions/387619/…
जोनो

3
$env:PATHपहले सेट क्यों नहीं किया गया , setx /m PATH "$env:PATH"ताकि शेल के पुनरारंभ के बिना यह स्थानीय और विश्व स्तर पर लागू हो?
ट्रेसफ

1
अच्छा! हालाँकि setx एक देशी cmdlet नहीं है, फिर भी उन अप्रिय लंबी घुमावदार .NET फ्रेमवर्क कॉल के लिए बहुत बेहतर और आसानी से भूल गया विकल्प है! यह भी चौंकाने वाला है कि पॉवर्सशेल 7 अभी भी एन्वार को जारी रखने के लिए एक आधिकारिक cmdlet के साथ नहीं आता है। क्या। एक सुविधा की तरह लगता है जिसमें 'ls' के साथ समता होनी चाहिए।
जोनास

27

जीनत के जवाब की तरह , मुझे रास्ते में जोड़ने के लिए एक अमूर्तता चाहिए थी। जीनट के जवाब के विपरीत मुझे उपयोगकर्ता की सहभागिता के बिना इसे चलाने की आवश्यकता थी। अन्य व्यवहार जिसकी मुझे तलाश थी:

  • अपडेट $env:Pathइसलिए वर्तमान सत्र में परिवर्तन प्रभावी होता है
  • भविष्य के सत्रों के लिए पर्यावरण चर परिवर्तन को जारी रखता है
  • जब समान पथ पहले से मौजूद हो तो डुप्लिकेट पथ नहीं जोड़ता है

मामले में यह उपयोगी है, यहाँ यह है:

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

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

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

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

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

इसी कार्य के लिए मेरे जिस्ट की जाँच करें Remove-EnvPath


16

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

इसे प्राप्त करने के लिए, आप स्पष्ट रूप से पावरशेल का उपयोग कर सकते हैं:

$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

अधिक जानकारी ब्लॉग पोस्ट में है अपने पर्यावरण पथ को संशोधित करने के लिए PowerShell का उपयोग करें

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

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

12

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

SetEnvironmentVariableके REG_EXPAND_SZमान %SystemRoot%\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
 }

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


यह होना चाहिए: $ newPath = $ newPath -replace ";;", ",;" ?
जो जॉन्सटन

8

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

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


6

@Michael Kropat के उत्तर पर बिल्डिंग मैंने मौजूदा 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 ';'
            }
        }
    }
}

5

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

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
    }

}

5

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

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

इसके बाद 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

4

मेरा सुझाव यह है:

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

$ENV:PATH

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

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

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

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\Control\Session Manager\Environment -Name PATH).Path

अब आप अपने PowerShell टर्मिनल को पुनः आरंभ कर सकते हैं (या मशीन को रिबूट भी कर सकते हैं) और देख सकते हैं कि यह फिर से अपने पुराने मूल्य पर नहीं जाता है।

ध्यान दें कि रास्तों का क्रम बदल सकता है ताकि यह वर्णानुक्रम में हो, इसलिए सुनिश्चित करें कि आप पूरी पंक्ति की जाँच करें। इसे आसान बनाने के लिए, आप सेमी-कोलोन को एक सीमांकक के रूप में उपयोग करके पंक्तियों को आउटपुट में विभाजित कर सकते हैं:

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


1

PowerShell के भीतर, कोई टाइप करके पर्यावरण चर निर्देशिका में नेविगेट कर सकता है:

Set-Location Env:

यह आपको Env:> डायरेक्टरी में ले जाएगा। इस निर्देशिका के भीतर से:

सभी पर्यावरण चर देखने के लिए, टाइप करें:

Env:\> Get-ChildItem

एक विशिष्ट पर्यावरण चर देखने के लिए, टाइप करें:

Env:\> $Env:<variable name>, e.g. $Env:Path

पर्यावरण चर सेट करने के लिए, टाइप करें:

Env:\> $Env:<variable name> = "<new-value>", e.g. $Env:Path="C:\Users\"

पर्यावरण चर निकालने के लिए, टाइप करें:

Env:\> remove-item Env:<variable name>, e.g. remove-item Env:SECRET_KEY

अधिक जानकारी के बारे में पर्यावरण चर में है


0

मैंने एसबीएफ और माइकल का अनुकूलन करने की कोशिश की कोड को थोड़ा अधिक करने का प्रयास किया।

मैं PowerShell के प्रकार के जोर पर भरोसा कर रहा हूं, जहां यह स्वचालित रूप से स्ट्रिंग को मानों में परिवर्तित करता है, इसलिए मैंने लुकअप डिक्शनरी को परिभाषित नहीं किया।

मैंने एक शर्त के आधार पर सूची में नया पथ जोड़ने वाले ब्लॉक को भी निकाला, ताकि काम एक बार किया जाए और फिर से उपयोग के लिए एक चर में संग्रहीत किया जाए।

यह तब स्थायी रूप से या केवल सत्र के आधार पर लागू किया जाता है $PathContainer पैरामीटर के ।

हम किसी फ़ंक्शन या ps1 फ़ाइल में कोड के ब्लॉक को डाल सकते हैं जिसे हम कमांड प्रॉम्प्ट से सीधे कॉल करते हैं। मैं DevEnvAddPath.ps1 के साथ गया था।

param(
    [Parameter(Position=0,Mandatory=$true)][String]$PathChange,

    [ValidateSet('Machine', 'User', 'Session')]
    [Parameter(Position=1,Mandatory=$false)][String]$PathContainer='Session',
    [Parameter(Position=2,Mandatory=$false)][Boolean]$PathPrepend=$false
)

[String]$ConstructedEnvPath = switch ($PathContainer) { "Session"{${env:Path};} default{[Environment]::GetEnvironmentVariable('Path', $containerType);} };
$PathPersisted = $ConstructedEnvPath -split ';';

if ($PathPersisted -notcontains $PathChange) {
    $PathPersisted = $(switch ($PathPrepend) { $true{,$PathChange + $PathPersisted;} default{$PathPersisted + $PathChange;} }) | Where-Object { $_ };

    $ConstructedEnvPath = $PathPersisted -join ";";
}

if ($PathContainer -ne 'Session') 
{
    # Save permanently to Machine, User
    [Environment]::SetEnvironmentVariable("Path", $ConstructedEnvPath, $PathContainer);
}

# Update the current session
${env:Path} = $ConstructedEnvPath;

मैं एक DevEnvRemovePath.ps1 के लिए कुछ ऐसा ही करता हूं।

param(
    [Parameter(Position=0,Mandatory=$true)][String]$PathChange,

    [ValidateSet('Machine', 'User', 'Session')]
    [Parameter(Position=1,Mandatory=$false)][String]$PathContainer='Session'
)

[String]$ConstructedEnvPath = switch ($PathContainer) { "Session"{${env:Path};} default{[Environment]::GetEnvironmentVariable('Path', $containerType);} };
$PathPersisted = $ConstructedEnvPath -split ';';

if ($PathPersisted -contains $PathChange) {
    $PathPersisted = $PathPersisted | Where-Object { $_ -ne $PathChange };

    $ConstructedEnvPath = $PathPersisted -join ";";
}

if ($PathContainer -ne 'Session') 
{
    # Save permanently to Machine, User
    [Environment]::SetEnvironmentVariable("Path", $ConstructedEnvPath, $PathContainer);
}

# Update the current session
${env:Path} = $ConstructedEnvPath;

अब तक, वे काम करने लगते हैं।


0

रजिस्ट्री में मूल्य को धक्का देने वाले केवल उत्तर एक स्थायी परिवर्तन को प्रभावित करते हैं (इसलिए इस थ्रेड पर अधिकांश उत्तर स्वीकृत उत्तर सहित, स्थायी रूप से प्रभावित नहीं करते हैं Path)।

निम्नलिखित फ़ंक्शन दोनों Path/ PSModulePathऔर User/ Systemप्रकार के लिए काम करता है । यह डिफ़ॉल्ट रूप से वर्तमान सत्र में नया पथ भी जोड़ देगा।

function AddTo-Path {
    param ( 
        [string]$PathToAdd,
        [Parameter(Mandatory=$true)][ValidateSet('System','User')][string]$UserType,
        [Parameter(Mandatory=$true)][ValidateSet('Path','PSModulePath')][string]$PathType
    )

    # AddTo-Path "C:\XXX" "PSModulePath" 'System' 
    if ($UserType -eq "System" ) { $RegPropertyLocation = 'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment' }
    if ($UserType -eq "User"   ) { $RegPropertyLocation = 'HKCU:\Environment' } # also note: Registry::HKEY_LOCAL_MACHINE\ format
    $PathOld = (Get-ItemProperty -Path $RegPropertyLocation -Name $PathType).$PathType
    "`n$UserType $PathType Before:`n$PathOld`n"
    $PathArray = $PathOld -Split ";" -replace "\\+$", ""
    if ($PathArray -notcontains $PathToAdd) {
        "$UserType $PathType Now:"   # ; sleep -Milliseconds 100   # Might need pause to prevent text being after Path output(!)
        $PathNew = "$PathOld;$PathToAdd"
        Set-ItemProperty -Path $RegPropertyLocation -Name $PathType -Value $PathNew
        Get-ItemProperty -Path $RegPropertyLocation -Name $PathType | select -ExpandProperty $PathType
        if ($PathType -eq "Path") { $env:Path += ";$PathToAdd" }                  # Add to Path also for this current session
        if ($PathType -eq "PSModulePath") { $env:PSModulePath += ";$PathToAdd" }  # Add to PSModulePath also for this current session
        "`n$PathToAdd has been added to the $UserType $PathType"
    }
    else {
        "'$PathToAdd' is already in the $UserType $PathType. Nothing to do."
    }
}

# Add "C:\XXX" to User Path (but only if not already present)
AddTo-Path "C:\XXX" "User" "Path"

# Just show the current status by putting an empty path
AddTo-Path "" "User" "Path"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.