我的D:DocumentsWindowsPowerShellprofile.ps1
配置文件上有以下行:
Set-Location $env:HOMEDRIVE
值得注意的是,$env:HOMEDRIVE
等于C:
。预期的行为是,每当我打开 PS 外壳时,我都会被放入C:
,但这不是我得到的,而是我被放置在$env:HOMEPATH
中,这等于C:Users<my username here>
。
为什么会有这种行为以及如何"修复"?
有关我的 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
将位置设置为没有路径的驱动器号(即。C:
) 只是切换到该驱动器的位置堆栈,它实际上不会更改路径。将其更改为:
Set-Location (Join-Path $env:HOMEDRIVE '')
测试。我把它放在我的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:>
为了用背景信息补充Mathias R. Jessen的有用答案:
PowerShell的
Set-Location $env:HOMEDRIVE
相当于cmd.exe
的:
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
以查看它扩展的内容; 有关详细信息, 看到我的这个答案。