我正在尝试在脚本中从用户的主目录中获取一个目录。 这就是我正在尝试的,但~
作为文字穿插,而不是扩展到主目录。 有没有办法让它扩展? 如果没有,我可以通过其他方式获取主目录吗?
$mySourceDir = "~/Projects/svn/myProject/trunk" # Single quote also does not expand
cd $mySourceDir
这是在OSX上使用PS 6测试版。
在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 平台上的工作方式类似)。
仅当您确定当前位置是文件系统位置时才使用~
:
当前位置是PowerShell对当前目录的通用概念:PowerShell将驱动器的概念概括为包括其他(通常)分层数据存储,例如Windows注册表,所有已定义函数(驱动器
Function:
),变量(Variable
)或环境变量(Env:
)的目录。每个这样的驱动器都由驱动器提供程序提供,文件系统[驱动器提供程序] 只是其中一个实例。
~
是特定于驱动器提供程序的概念,因此仅使用~
,而不显式引用驱动器提供程序,是指当前位置基础提供程序定义的主位置。- 某些提供程序没有为
~
表示的内容提供默认值,从而导致使用它的尝试失败;例如,Environment
驱动器提供程序就是这种情况,其Env:
drive:Set-Location Env:; Set-Location ~
会导致错误Home location for this provider is not set. To set the home location, call "(get-psprovider 'Environment').Home = 'path'
- 某些提供程序没有为
它是驱动器提供程序解释
~
,因此~
也可以在'...'
和"..."
- 从文件系统位置,以下命令的工作方式都相同:
Set-Location ~/Desktop
Set-Location "~/Desktop"
Set-Location '~/Desktop'
- 将其与类似 POSIX 的 shell 进行对比,例如
bash
,在目标命令看到它之前,它是在前面扩展~
的shell,但前提是它没有引号。
- 从文件系统位置,以下命令的工作方式都相同:
尝试
$mySourceDir = "$env:HOME/Projects/svn/myProject/trunk"