Профиль Windows Powershell $не показывает реальный путь

Я запускаю Windows Powershell (нажав клавишу Windows, набрав "powershell" и нажав enter, который запускает C:\Windows\System32\WindowsPowerShell\v1.0), и наберите $profile и нажмите enter и посмотрите WindowsPowerShell\Microsoft.PowerShell_profile.ps1

Насколько я знаю, это не допустимый путь. Я надеялся на что-то вроде C:\Windows\...

При вводе $profile | Format-List * -Force, однако, есть некоторый прогресс, и я получаю

AllUsersAllHosts       : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost    : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts    : WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Length                 : 50

Однако CurrentUserAllHosts и CurrentUserCurrentHosts по-прежнему не являются путями. Что означают эти непустые пути? Они ссылаются на некоторые скрытые значения или мне нужно каким-то образом установить некоторые системные значения?

Вот мой $PsVersionTable.PsVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      14393  206

Ниже приведены результаты Get-Host

Name             : ConsoleHost
Version          : 5.1.14393.206
InstanceId       : a2a61a42-f2ee-46b9-b67a-ef441301bdb8
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-US
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

Ответы

Ответ 1

ТЛ; др:

Проблема может быть не связана с PowerShell, но может быть связана с отсутствием определения пути к специальной папке в реестре.

Убедитесь, что раздел реестра HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders содержит значение REG_EXPAND_SZ с именем Personal с данными %USERPROFILE%\Documents - см. ниже диагностические команды.

Если вы обнаружите, что должны (заново) создать его, используйте:

New-ItemProperty '
  'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders' '
  Personal -Value '%USERPROFILE%\Documents' -Type ExpandString -Force

а затем выйдите из системы и снова включите ее (или перезагрузите), чтобы убедиться, что это решило проблему.


Полезный ответ Eris говорит нам, что пользовательские пути профиля PS получены из того, что Environment.GetFolderPath(Environment.SpecialFolder.Personal) возвращает.

.NET получает это значение, предположительно через функцию API оболочки SHGetKnownFolderPath, из раздела реестра HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders, значение Personal, где оно обычно определяется как значение REG_EXPAND_SZ, содержащее (расширяемую) строку %USERPROFILE%\Documents.
(Здесь также имеется устаревшее резервное местоположение - см. здесь.)

Профили CurrentUserAllHosts и CurrentUserCurrentHost, содержащие только относительные пути, а именно:

  • WindowsPowerShell\profile.ps1
  • WindowsPowerShell\Microsoft.PowerShell_profile.ps1

предполагает, что вызов Environment.GetFolderPath(Environment.SpecialFolder.Personal), чей результат используется в качестве префикса пути, неожиданно вернул пустую строку, что, в свою очередь, указывает на проблему с реестром.


Вот некоторые диагностические команды и их ожидаемые результаты (jdoe представляет ваше имя пользователя):

# Verify that %USERPROFILE% is defined.
> $env:USERPROFILE
C:\Users\jdoe

# Verify that %USERPROFILE% is defined in the registry.
> Get-ItemPropertyValue 'HKCU:\Volatile Environment' USERPROFILE
C:\Users\jdoe

# Verify that the API call to retrieve the known folder
# "Personal" (Documents) returns the expected value.
> [Environment]::GetFolderPath('Personal')
C:\Users\jdoe\Documents

# See if the registry contains the expected definition.
> Get-ItemPropertyValue 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders' Personal
C:\Users\jdoe\Documents

Ответ 2

В соответствии с исходным кодом powershell на github они ищут Environment.SpecialFolder.Personal

Он начинается с ConsoleHost.cs и вы можете отслеживать это до utils.cs, где они вызывают Environment.GetFolderPath(Environment.SpecialFolder.Personal);