উইন্ডোজ পাওয়ারশেল পরিবেশের ভেরিয়েবল সেট করা


605

আমি খুঁজে পেয়েছি যে PATH এনভায়রনমেন্ট ভেরিয়েবল সেট করা কেবল পুরানো কমান্ড প্রম্পটকেই প্রভাবিত করে। পাওয়ারশেলের বিভিন্ন পরিবেশ সেটিংস রয়েছে বলে মনে হয়। আমি কীভাবে পাওয়ারশেলের জন্য পরিবেশের পরিবর্তনগুলি (v1) পরিবর্তন করব?

বিঃদ্রঃ:

আমি আমার পরিবর্তনগুলি স্থায়ী করতে চাই, সুতরাং প্রতিবার পাওয়ারশেল চালানোর সময় আমাকে এটি সেট করতে হবে না। পাওয়ারশেলের একটি প্রোফাইল ফাইল আছে? ইউনিক্সে বাশ প্রোফাইলের মতো কিছু?


1
আমি একটি ফাইল ভাগ করে একটি কেন্দ্রীয় প্রোফাইল থাকতে চান। সিঙ্ক্রোনাইজেশন একটি ব্যথা। এর সাথে স্টাব প্রোফাইল তৈরি করা হচ্ছে। \\ কম্পিউটার \ ভাগ করুন \ প্রোফাইল \ প্রোফাইল.ps1 মনে হচ্ছে একটি কলডজ (নোটপ্যাড $ প্রোফাইল চেষ্টা করুন)। স্থায়ীভাবে $ প্রোফাইল স্বয়ংক্রিয় ভেরিয়েবল পরিবর্তন করার কোনও উপায় থাকলে ভাল লাগবে।
নাথান হার্টলি

5
কোনও PATH পরিবেশ পাওয়ারশেল কমান্ড প্রম্পটকেও প্রভাবিত করে না। তবে তারতম্যটি হ'ল পাওয়ারশেল উদ্ধৃতিতে আবদ্ধ পথগুলি গ্রহণ করে না। সমাধান: "পাথ পরিবেশ পরিবর্তনশীল সমস্ত
এনকোলেজিং

3
আপনি যদি পিএস> ভি 1 এর জন্য এখানে থাকেন ... উপরের নীলজারের মন্তব্যে: আপনার অধিবেশনটির জন্য প্যাথ পরিবেশে পরিবর্তনশীল সমস্ত "পাথগুলি" থেকে সরাতে এটি ব্যবহার করুন:$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
d3r3kk

উত্তর:


476

প্রকৃত পরিবেশের ভেরিয়েবল পরিবর্তন করা env: namespace / driveতথ্য ব্যবহার করে করা যেতে পারে । উদাহরণস্বরূপ, এই কোডটি পাথ পরিবেশের পরিবর্তনশীলটিকে আপডেট করবে:

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

পরিবেশের সেটিংস স্থায়ী করার উপায় আছে তবে আপনি যদি কেবল সেগুলি পাওয়ারশেল থেকে ব্যবহার করেন তবে সেটিংস শুরু করার জন্য আপনার প্রোফাইলটি ব্যবহার করা আরও অনেক ভাল। প্রারম্ভকালে, পাওয়ারশেল আমার ডকুমেন্টস ফোল্ডারের অধীনে ডিরেক্টরিতে পাওয়া কোনও .ps1 ফাইল চালাবেWindowsPowerShell । সাধারণত আপনার ইতিমধ্যে একটি প্রোফাইল . ps1 ফাইল রয়েছে। আমার কম্পিউটারে পথ

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

38
প্রোফাইলটি একটি স্বয়ংক্রিয় পরিবর্তনশীল যা আপনার পাওয়ার প্রোফাইলে সমস্ত পাওয়ারশেল হোস্টের জন্য নির্দেশ করে।
জেসনমারেচার

16
মনে রাখবেন (বিভক্ত-পথ $ প্রোফাইল) (ধারণকৃত ফোল্ডারটি পেতে) একাধিক প্রোফাইল ফাইল ধারণ করতে পারে: প্রোফাইল.ps1 সমস্ত হোস্ট দ্বারা লোড করা উচিত, <হোস্ট- নাম> _প্রোফাইল.ps1 কেবলমাত্র নির্দিষ্ট হোস্টের দ্বারা। পাওয়ারশেল.এক্সই (কনসোল হোস্ট) এর জন্য এটি মাইক্রোসফ্ট। পাওয়ারশেল_প্রোফাইল.ps1।
রিচার্ড

10
আমার ডকুমেন্টগুলিতে যদি উইন্ডোজপাওয়ারশেল ফোল্ডার না থাকে? আমার ফোল্ডার এবং ফাইলটি তৈরি করা উচিত? আমি যদি C:\path\to\file.extপরিবেশের ভেরিয়েবলগুলিতে যুক্ত করতে চাই তবে ফাইলটিতে আমার কী রাখা উচিত ? সম্পাদনা: এটি ইতিমধ্যে খুঁজে পেয়েছে। উত্তর হ্যাঁ, এটি তৈরি করুন। ফাইল 1 টি লাইন দ্বারা গঠিত হবে: $env:path += ;C:\path\to\file.ext"
লুইস্ট্রিক

7
@ লুইস্ট্রিক আপনার ডিফল্টরূপে কোনও প্রোফাইল নেই। : আমি একটি তৈরি করতে এই নির্দেশাবলী অনুসরণ howtogeek.com/50236/customizing-your-powershell-profile
MikeB

16
এটি করতে সতর্কতা অবলম্বন করুন - এটি আপনার বিদ্যমান পথটিকে শক্ত করে তুলবে। $env:Path = "SomeRandomPath"; পরিবর্তে - নীচে নীচে @ মিলসকোট দেখুন।
জন মার্ক

626

যদি, পাওয়ারশেল সেশনের সময় কিছু সময়, আপনাকে অস্থায়ীভাবে PATH এনভায়রনমেন্ট ভেরিয়েবলের সাথে যুক্ত করা দরকার, আপনি এটি এইভাবে করতে পারেন:

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

4
+1 :: এই ওয়ান-লাইনারটি মেশিংয়ের মতো সেশন-ভিত্তিক আমন্ত্রণগুলির জন্য বেশ কার্যকর ... আই $ এনভি: প্যাথ + = "; সি: \ মিনজিডাব্লু \ এমএসআই \ 1.0 \ বিন" ^ {কিছু মিংডবিন ... }
এডি বি

2
এবং আমি কীভাবে কোনও পথ সরিয়ে ফেলব?
বেকো

11
আপনার যদি স্ট্যান্ডার্ড একের আগে কল করার প্রয়োজন হয় তবে শুরুতে এটি $env:Path = "C:\MyPath;$env:Path"
sertোকান

4
**** অ্যাডেন্ডিং স্ট্রিংয়ের শুরুতে সেমিকোলনটি ভুলে যাবেন না, যেমনটি @ কেভিনের মন্তব্যে দেখা যায়। এটি বেশ সুস্পষ্ট, তবে আপনি যদি উত্তরটি কোডটি কেবল অনুলিপি / পেস্ট করে থাকেন এবং বিদ্যমান পথের শেষে সেমিকোলন না পেয়ে থাকেন তবে তা মিস করা যায়। আমি একটি সম্পাদনা জমা দেওয়ার চেষ্টা করব।
ম্যাট গুডরিচ

1
@ ম্যাটগুডরিচ আমি আগের সংশোধনীতে রোলব্যাক করেছি
Cœur

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
@ এন্ড্রেসরিওফ্রিও, হ্যাঁ, এটি স্থায়ী। ব্যবহার: [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine) আপনি নতুন পাওয়ারশেল সেশন শুরু না করা পর্যন্ত আপনি এই পরিবর্তনের ফলাফল দেখতে পাবেন না। এটি হ'ল, যদি আপনি command env: এই কমান্ডটি চালানোর সাথে সাথেই পাথটি পরীক্ষা করেন তবে আপনি কি দেখতে পাবেন will env: কমান্ডের আগে পাথ ছিল। আপডেট করতে, শেলটি বন্ধ করুন এবং খুলুন বা একটি নতুন সেশন শুরু করুন।
FLGMwt

7
@ এফএলজিএমডব্লিউডে আপনার টাইপ রয়েছে, সঠিক: [পরিবেশনা] :: সেটটিনিউশনভেরিয়েবল ("পথ", $ এনভি: পথ + "; সি: \ বিন", [পরিবেশগত পরিবর্তনশীল]: মেশিন)
উত্সাহ গত

10
আপনি পুরো। নেট এনামের পরিবর্তে "মেশিন" বা "ব্যবহারকারী" স্ট্রিং লিখতে পারেন। টেকনেট থেকে ।
বুভিয়ার

3
আমি মনে করি যে উত্তরটির ব্যবহারকারীর ভেরিয়েবল সেট করার জন্যও ব্যবহারটি প্রদর্শন করা উচিত[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
সাইটো

63

পাওয়ারশেল প্রম্পট থেকে:

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

তারপরে আপনার পাঠ্যটি দেখতে হবে:

SUCCESS: Specified value was saved.

আপনার সেশনটি পুনরায় আরম্ভ করুন, এবং পরিবর্তনশীল উপলব্ধ হবে will setxস্বেচ্ছাসেবী ভেরিয়েবল সেট করতেও ব্যবহার করা যেতে পারে। setx /?ডকুমেন্টেশনের জন্য প্রম্পটে টাইপ করুন ।

এইভাবে আপনার পাথের সাথে ঝামেলা করার আগে নিশ্চিত হয়ে নিন যে আপনি পাওয়ার $env:path >> a.outশেল প্রম্পটে করে আপনার বিদ্যমান পথের একটি অনুলিপি সংরক্ষণ করেছেন ।


5
কেবলমাত্র 'প্রশাসক হিসাবে চালানো' কাজ করার জন্য মনে হয় এবং এরপরে কেবল 'প্রশাসক হিসাবে চালানো' পাওয়ারশেল কনসোলগুলি নিয়মিতভাবে চালিত না হয়ে কার্যকর হয়।
ম্যাটানস্টার


12
আউচ - সেক্সেক্সের 1024 অক্ষর সীমা দ্বারা সবেমাত্র আঘাত পেয়েছে; কৃতজ্ঞভাবে আমি $ প্রান্ত: পথের বিদ্যমান মানটি রেকর্ড করার পরামর্শটি অনুসরণ করেছি। সচেতন হওয়ার জন্য কেবল কিছু: superuser.com/questions/387619/…
জোনো

3
কেন $env:PATHপ্রথমে সেট করা হয়নি , তারপরে setx /m PATH "$env:PATH"এটি শেল রিস্টার্ট ছাড়াই স্থানীয়ভাবে এবং বিশ্বব্যাপী প্রয়োগ হয়?
tresf

1
নিস! যদিও সেটেক্স কোনও দেশীয় সেমিডলেট নয়, তবুও সেইসব অত্যাশ্চর্য দীর্ঘ ঘূর্ণায়মানগুলির জন্য আরও ভাল এবং সহজেই ভুলে যাওয়া বিকল্প N নেট ফ্রেমওয়ার্ক কল! এটি অবাক করে দেয় যে এমনকি পাওয়ারশেল 7 এখনও এনভায়ারদের অবিচ্ছিন্ন রাখতে কোনও অফিসিয়াল সিএমডিলেট নিয়ে আসে না। কি. এমন বৈশিষ্ট্যের মতো মনে হয় যাতে 'এলএস' এর সমতা থাকা উচিত।
জোনাস

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

আরও তথ্য ব্লগ পোস্টে রয়েছে আপনার পরিবেশগত পথ পরিবর্তন করতে পাওয়ারশেল ব্যবহার করুন

আপনি যদি পাওয়ারশেল সম্প্রদায়ের এক্সটেনশনগুলি ব্যবহার করেন, পরিবেশের পরিবর্তনশীল পথে কোনও পাথ যুক্ত করার জন্য সঠিক কমান্ডটি হ'ল:

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

@ মিশেল ক্রোপাটের উত্তরের ভিত্তিতে বিল্ডিং আমি বিদ্যমান 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

বেশিরভাগ উত্তর ইউএসি- কে সম্বোধন করে না । এটি ইউএসি বিষয়গুলি কভার করে।

প্রথম পাওয়ারশেল সম্প্রদায় এক্সটেনশানগুলি ইনস্টল করুন: http://chocolatey.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আপনি আপনার পাওয়ারশেল টার্মিনালটি বন্ধ করে আবার খোলার সাথে সাথে এটি পূর্বের দিকে ফিরে আসবে। কারণ আপনি পরিবর্তনটি সেশন পর্যায়ে প্রয়োগ করেছেন এবং উত্স স্তরে নয় (যা রেজিস্ট্রি স্তর)। এর বৈশ্বিক মান দেখতে $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

আপনি এখন আপনার পাওয়ারশেল টার্মিনালটি পুনরায় চালু করতে পারেন (বা এমনকি মেশিনটি পুনরায় বুট করুন) এবং দেখুন যে এটি আবার তার পুরানো মানটিতে রোলব্যাক করে না।

নথগুলি ক্রমের ক্রমটি পরিবর্তিত হতে পারে যাতে এটি বর্ণানুক্রমিক ক্রমে থাকে, সুতরাং নিশ্চিত হয়ে নিন যে আপনি পুরো লাইনটি পরীক্ষা করেছেন। এটি আরও সহজ করার জন্য, আপনি একটি ডিলিমিটার হিসাবে আধা-কোলন ব্যবহার করে আউটপুটটিকে সারিগুলিতে বিভক্ত করতে পারেন:

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

3

পাওয়ারশেল ওপেন করুন:

[Environment]::SetEnvironmentVariable("PATH", "$ENV:PATH;<path to exe>", "USER")

1

পাওয়ারশেলের মধ্যে, কেউ টাইপ করে এনভায়রনমেন্ট ভেরিয়েবল ডিরেক্টরিতে নেভিগেট করতে পারে:

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

আমি এসবিএফ এবং মাইকেলকে অপ্টিমাইজ করার চেষ্টা করেছি আরও কমপ্যাক্ট করার জন্য কোডটি কিছুটা অনুকূল করার চেষ্টা করেছি।

আমি পাওয়ারশেলের ধরণের জোরের উপর নির্ভর করছি যেখানে এটি স্বয়ংক্রিয়ভাবে স্ট্রিংগুলিকে এনাম মানগুলিতে রূপান্তর করে, তাই আমি অনুসন্ধানের অভিধানটি সংজ্ঞায়িত করিনি।

আমি শর্তের ভিত্তিতে তালিকায় নতুন পথ যুক্তকারী ব্লকটিও টানলাম, যাতে কাজটি একবার হয়ে যায় এবং পুনরায় ব্যবহারের জন্য একটি ভেরিয়েবলে সংরক্ষণ করা হয়।

এটি স্থায়ীভাবে বা কেবলমাত্র সেশনের উপর নির্ভর করে প্রয়োগ করা হয় $PathContainer প্যারামিটারের ।

আমরা কোনও ফাংশন বা একটি পিএস 1 ফাইলের মধ্যে কোডের ব্লকটি রাখতে পারি যা আমরা কমান্ড প্রম্পট থেকে সরাসরি কল করি। আমি 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"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.