我的D:\Documents\WindowsPowerShell\profile.ps1
个人资料档案中有以下一行:
Set-Location $env:HOMEDRIVE
值得注意的是$env:HOMEDRIVE
等于C:
。预期的行为是,每当我打开PS shell时,我都会被放入C:
,但这不是我得到的,而是放在$env:HOMEPATH
中,等于到C:\Users\<my username here>
。
为什么会出现这种行为以及如何解决&#34;?
有关我的PS版本的信息:
PS C:\Users\...> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.14393.2068
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.14393.2068
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
答案 0 :(得分:4)
将位置设置为没有路径的驱动器号(即C:
)只是切换到该驱动器的位置堆栈,它实际上并没有改变路径。将其更改为:
Set-Location (Join-Path $env:HOMEDRIVE '\')
答案 1 :(得分:1)
进行测试。我把它放在我的profile.ps1
:
Set-Location $env:HOMEDRIVE
Write-Host $env:HOMEDRIVE
<强>输出强>
C:
PS C:\Users\<my username>>
解决强>
Set-Location "$($env:HOMEDRIVE)\"
Write-Host $env:HOMEDRIVE
<强>输出强>
C:
PS C:\>
答案 2 :(得分:1)
使用背景信息 补充 Mathias R. Jessen's helpful answer:
的PowerShell&#39; S
Set-Location $env:HOMEDRIVE
相当于cmd.exe
&#39;:
cd /d %HOMEDRIVE%
也就是说,对环境变量HOMEDRIVE
的引用将替换为其值(已展开) - 通常为C:
- 并且驱动器已更改到。请注意PowerShell如何不需要模拟/d
开关才能使驱动器更改生效。
但是,在两个shell中,更改为驱动器规范。仅 - 没有路径组件 - 更改为无论shell认为该驱动器上的当前目录 ,它可能是也可能不是根目录。
虽然Set-Location (Join-Path $env:HOMEDRIVE '\')
是一种强大且通用的构建方法,并且将路径传递到驱动器规范的根目录。存储在环境变量HOMEDRIVE
中的PowerShell提供了更简洁的替代:
Set-Location $env:HOMEDRIVE\ # or, with variable name disambiguated: ${env:HOMEDRIVE}\
上述工作,因为,简单地说,PowerShell隐式解析字符串参数,好像它们是可扩展字符串(带有嵌入式变量引用的双引号字符串甚至是命令)。
也就是说,上述内容相当于以下所有内容:
Set-Location "$env:HOMEDRIVE\" # expandable string
Set-Location "${env:HOMEDRIVE}\" # ditto, variable name disambiguated
Set-Location "$(${env:HOMEDRIVE})\" # $(...) embeds full commands (not necessary here)
除了Join-Path
是一种更强大的方式来加入路径组件之外,还有陷阱与关联,带有非引用参数的方法,例如微妙的差异在不带引号和双引号的参数之间(内部空白需要双引号,某些字符是shell元字符);如有疑问,请将参数传递给Write-Output
以查看它扩展到的内容;有关详细信息,请参阅我的this answer。