web-dev-qa-db-ja.com

Windows10のPowerShellでPSModulePath環境変数を設定する

わかりません。したがって、現在、「PSModulePath」という名前のシステム環境変数は次のようになっています。

%ProgramFiles%\WindowsPowerShell\Modules;%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules

次に、次のPowerShellスクリプトを確認します。

$envarname = "PSModulePath"
$envar = (get-item env:$envarname).Value
[Environment]::SetEnvironmentVariable($envarname, $envar + ";C:\Expedited", "Machine")

shouldは、パス「C:\ Expedited」をPSModulesPath環境変数に追加するだけですよね?このスクリプトを管理者として実行すると、PSModulePath環境変数は次のように変更されます。

C:\Users\Username\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules;C:\Expedited

次のことに注意してください。

  1. 元々は2つのパスがあり、それぞれが元のパスにパーセンテージ記号(変数)を含んでいましたが、その後、すべてハードコードされたパスに直接変更されました。
  2. 「C:\ Users\Username\Documents\WindowsPowerShell\Modules」パスがどこからともなく発生しました(元のパスにはありませんでした!)

なぜこれら2つのことが起こったのか私にはわかりません。この変数にパスを追加するときは、他のすべての変更を行うのではなく、できるだけ元の変数に近づけたいと思います。失われたパーセンテージの兆候を保存する方法はありますか? PowerShell内からこの環境変数を正しく編集するにはどうすればよいですか?

2
jippyjoe4

PowerShell-展開せずにOS環境変数を取得する

Get-Item コマンドレットを-pathパラメーターとともに使用してから、PSModulePath環境変数を含むレジストリキーのパスを渡すことができます。

次に、 RegistryKey.GetValueメソッドDoNotExpandEnvironmentNames と一緒に使用して、PSModulePath環境変数の文字列値を展開せずに取得できます。


パワーシェル

$envarname = "PSModulePath"
$regkey    = Get-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
$envar     = $regkey.GetValue($envarname, "", "DoNotExpandEnvironmentNames")
ECHO $envar

注:正しく機能させるには、管理者の昇格したPowerShellコマンドプロンプトまたはISE画面からこれを実行する必要があります。

enter image description here


その他のリソース

  • ハウツー:Windowsで環境変数を設定する-コマンドラインとレジストリ

    レジストリ内のユーザー変数の場所は次のとおりです:HKEY_CURRENT_USER\Environment。レジストリ内のシステム変数の場所は次のとおりです。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
    

    レジストリを介して環境変数を設定する場合、それらはすぐには認識されません。 1つのオプションは、ログアウトしてから再度ログインすることです。ただし、これをプログラムで実行する場合は別の行である WM_SETTINGCHANGE メッセージを送信すると、ログアウトを回避できますが、コマンドラインでこれを実行する場合はそれほど簡単ではありません。

  • Get-Item

  • RegistryKey.GetValueメソッド

    指定された名前と取得オプションに関連付けられた値を取得します。名前が見つからない場合は、指定したデフォルト値を返します。

  • RegistryKey.GetValueメソッド(String、Object、RegistryValueOptions)

    このオーバーロードを使用して、取得した値の特別な処理を指定します。たとえば、RegistryValueKind.ExpandString型のレジストリ値を取得するときに RegistryValueOptions.DoNotExpandEnvironmentNames を指定して、埋め込み環境変数を展開せずに文字列を取得できます。

2
Pimp Juice IT

最終目標に実際には必要のない追加の手順を実行しています。 MSガイダンスに示されているデフォルトを使用してください。

https://docs.Microsoft.com/en-us/powershell/module/Microsoft.powershell.core/about/about_environment_variables?view=powershell-6

したがって、上記の記事に基づくと、組み込みのデフォルト/自動環境変数を使用することで、最後の例、または1行だけが必要になります。

[System.Environment]::SetEnvironmentVariable("PSModulePath", $Env:PSModulePath + ";C:\Expedited","Machine")
0
postanote