如何设置默认位置以在profile.ps1中启动?

时间:2018-02-17 22:06:09

标签: powershell powershell-v5.0

我的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

3 个答案:

答案 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