如何将默认位置设置为在配置文件中启动。ps1?

How to set default location to start in profile.ps1?

我的 D:\Documents\WindowsPowerShell\profile.ps1 配置文件中有以下行:

Set-Location $env:HOMEDRIVE

值得注意的是 $env:HOMEDRIVE 等于 C:。预期的行为是,每当我打开 PS shell 时,我都会被放入 C:,但这不是我得到的,而是我被放入 $env:HOMEPATH,等于 C:\Users\<my username here>.

为什么会出现这种行为以及如何 "fix"?


关于我的 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:\>

背景信息补充:

PowerShell 的

Set-Location $env:HOMEDRIVE

相当于cmd.exe的:

cd /d %HOMEDRIVE%
  • 也就是说,对环境变量 HOMEDRIVE 的引用被替换为它的值(扩展)- 通常是 C: - 而 drive 更改为 。请注意 PowerShell 如何 而不是 需要模拟 /d 开关才能使驱动器更改生效。

  • 但是,在两个 shell 中,更改为 驱动器规格。只有 - 没有路径组件 - 更改为 无论 shell 认为当前目录 在该驱动器 上,这可能是也可能不是根目录。

    • 为了切换到特定目录 - 例如根目录 - 它的路径也必须指定.

虽然 Set-Location (Join-Path $env:HOMEDRIVE '\') 是构建和 将路径传递到驱动器规格的根目录 的一种健壮且通用的方法。存储在环境变量 HOMEDRIVE 中,PowerShell 提供了一个 更简洁的替代方法 :

Set-Location $env:HOMEDRIVE\ # or, with variable name disambiguated: ${env:HOMEDRIVE}\

上面的方法有效,因为简单地说,PowerShell 隐式解析字符串参数,就好像它们是 可扩展字符串(double-quoted 带有嵌入式变量引用甚至命令的字符串) .

也就是说,以上等价于以下所有内容:

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 是一种更可靠的连接路径组件的方法之外,还有 陷阱 与 unquoted-argument 方法相关联,例如未引号和 double-quoted 参数之间的细微差别(内部空格 需要 double-quoting,某些 shell 字符也是如此元字符);如有疑问,将参数传递给 Write-Output 以查看它扩展到什么;有关详细信息,请参阅我的