Ответ 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