获取主目录?

Getting home directory?

我试图在脚本中从用户的主目录中获取一个目录。这就是我正在尝试的,但是 ~ 被插入为文字而不是扩展到主目录。无论如何让它扩大?如果没有,我可以通过其他方式获取主目录吗?

$mySourceDir = "~/Projects/svn/myProject/trunk" # Single quote also does not expand
cd $mySourceDir

这是在 OSX 上使用 PS 6 beta。

尝试

$mySourceDir = "$env:HOME/Projects/svn/myProject/trunk"

在 PowerShell 中,引用当前用户主目录的最可靠方法是 使用自动变量 $HOME,如果它是较大路径的一部分,则在 "...":

  • $mySourceDir = "$HOME/Projects/svn/myProject/trunk"; Set-Location $mySourceDir
    Set-Location 是 PowerShell 的 cd 等价物;但是由于内置别名定义,您也可以使用 cd。)

  • 如果您将路径作为 参数 传递给 命令 ,您可能能够获得没有封闭的 "...",取决于路径包含的字符;例如,
    Set-Location $HOME/Desktop

  • 适用于 Windows 和 Unix 平台,而如果您尝试使用 环境 变量例如 $env:HOME,平台差异会浮出水面。

  • 要了解 PowerShell 定义的所有自动变量(内置变量),请参阅概念性 about_Automatic_Variables 帮助主题(截至撰写本文时,$HOME仅反映 Windows 视角,但 $HOME 在 Unix 平台上的工作方式类似。


仅当您确定当前位置是 文件系统 位置时才使用 ~

  • The current location is PowerShell's generalized concept of the current directory: PowerShell generalized the concept of a drive 以包含其他(通常)分层数据存储,例如 Windows 注册表、所有已定义函数的目录(驱动器 Function:)、变量(Variable), 或环境变量 (Env:).

  • 每个这样的驱动器都由 驱动器提供商 提供,其中 文件系统 [驱动器提供商] 只是一个个实例。

  • ~ 是一个 特定于驱动器提供商的 概念,因此仅使用 ~,在没有明确引用驱动器提供者的情况下,指的是家庭位置,由当前位置下的提供者定义.

    • 一些提供商为 ~ 所代表的内容提供 无默认值 ,导致尝试使用它失败;例如,Environment 驱动器提供商及其 Env: 驱动器就是这种情况:
      Set-Location Env:; Set-Location ~ 结果出错
      Home location for this provider is not set. To set the home location, call "(get-psprovider 'Environment').Home = 'path'
  • 解释~的是驱动提供者,所以~也在[=35里面起作用=] 和 "..."

    • 从文件系统位置,以下命令都相同:
      • Set-Location ~/Desktop
      • Set-Location "~/Desktop"
      • Set-Location '~/Desktop'
    • 将此与类似 POSIX 的 shell 进行对比,例如 bash,其中扩展的 shell ~,前面,在目标命令看到它之前,但前提是它 未被引用