【问题标题】:How to set default location to start in profile.ps1?如何设置默认位置以在 profile.ps1 中开始?
【发布时间】:2018-07-28 12:30:43
【问题描述】:

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

Set-Location $env:HOMEDRIVE

值得注意的是$env:HOMEDRIVE 等于C:。预期的行为是,每当我打开 PS shell 时,我都会被放入 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

【问题讨论】:

  • 我无法在 PS 5.1.15063.909 上重现它
  • 为什么不使用cd c:\
  • @gms0ulman 因为 (1) 我想要一些可扩展的东西,C: 不是我所有系统中的HOMEDRIVE,这个profile.ps1 用于家庭和工作中的许多系统,即使他们都是C: 我永远不会在任何代码中使用静态路径,这只是不好的做法; (2) 我想使用 PS 语法,cd 只不过是Set-Location 的别名。无论如何,我尝试了cd C: 并没有工作......

标签: powershell powershell-5.0


【解决方案1】:

补充 Mathias R. Jessen's helpful answer背景信息

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 隐式解析字符串参数,就好像它们是可扩展字符串(带有嵌入式变量引用甚至命令的双引号字符串)。

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

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

【讨论】:

    【解决方案2】:

    测试。我把这个放在我的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:\>
    

    【讨论】:

      【解决方案3】:

      将位置设置为没有路径的驱动器号(即C:)只是切换到该驱动器的位置堆栈,它实际上并没有改变路径。将其更改为:

      Set-Location (Join-Path $env:HOMEDRIVE '\')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 2018-07-29
        相关资源
        最近更新 更多