如何在配置文件.ps1中设置默认位置以启动?



我的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以查看它扩展的内容; 有关详细信息, 看到我的这个答案。

最新更新