Windows Powershell $profile不显示真实路径

26

我打开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

然而,CurrentUserAllHostsCurrentUserCurrentHosts仍然是非路径。这些非路径是什么意思?它们是指一些隐藏值还是我需要在某个地方设置一些系统值?

这是我的$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

在我的Win 10机器上,$profile的值是C:\Users\userNamexxx\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1,但是实际上并没有这个文件夹或文件! - Baskar Lingam Ramachandran
1
默认情况下没有,您需要创建它。@Mark,如果您运行[Environment] :: GetFolderPath(“MyDocuments”)并打开CMD并运行echo%USERPROFILE%会发生什么? - Deadly-Bagel
WindowsPowerShell可能是指PowerShell的安装位置,基于使用的32位或64位进程?从C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ profile.ps1来看,更像是这样! - Prageeth Saravanan
@Mark:感谢您的接受;最终问题的原因是什么,您能否作为问题的补充说明一下? - mklement0
抱歉,我有一段时间无法访问我的Windows电脑。然而,当我刚刚尝试时...路径没问题了!我觉得问题可能是我将我的主文件夹从C:\Users\marki更改为C:\Users\mark,然后Windows在某种程度上感到困惑。现在我已经将其恢复为默认的marki,也许它已经被修复了。 - Mark
显示剩余4条评论
3个回答

20
注意:此问题与`$PROFILE`文件的不存在有关,可能连同其目录一起不存在。如果`$PROFILE`显示了预期的路径,并且您只想确保文件存在,请使用以下命令:
`if (-not (Test-Path $PROFILE)) { $null = New-Item -Force $PROFILE }`
简而言之:
问题可能与PowerShell无关,而是由于注册表中缺少特殊文件夹路径定义引起的。
请验证注册表键`HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders`是否包含名为`Personal`的`REG_EXPAND_SZ`值,其数据为`%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获取这个值,可能是通过SHGetKnownFolderPath Shell API函数,从注册表键HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders的值Personal中获取的,通常被定义为一个包含(可扩展)字符串%USERPROFILE%\DocumentsREG_EXPAND_SZ值。
(还有一个传统的备用位置-请参阅这里。)
包含只有相对路径的配置文件CurrentUserAllHostsCurrentUserCurrentHost,即:
  • 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

8
根据 GitHub 上 PowerShell 源代码,他们查找 Environment.SpecialFolder.Personal。这始于 ConsoleHost.cs,你可以跟踪此代码到 utils.cs,在那里它们调用 Environment.GetFolderPath(Environment.SpecialFolder.Personal);

1
今天我遇到了同样的问题,但是我成功地使用以下 PowerShell 命令创建了配置文件。
New-Item -path $PROFILE -type File -force

希望这能帮到你!

请注意,您遇到了一个不同的问题:您的$PROFILE变量的值是正确的(与OP的情况不同),但所指向的文件(可能连同其父目录)实际上还不存在。这就是New-Item -Force要解决的问题:它会在需要时创建文件,包括其目录。然而,请注意,如果文件已经存在,您将会清空其内容。GitHub问题#11677要求添加一个新开关到New-Item,以允许保留现有文件。 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接