当路径具有特殊字符时,包含脚本不起作用
我正在尝试使用点语法将一个脚本包含在同一文件夹中的另一个脚本中:
. '.BaseScript.ps1'
脚本的路径包含一个名称中带有方括号的文件夹。即使我使用的是相对路径,路径错误仍然发生。
将其移动到名称中没有特殊字符的其他路径可以正常工作。
在使用相对路径时如何满足这种情况?
回答
不幸的是,PowerShell 将. 点源和& 调用运算符(包括隐式调用[1])的操作数视为通配符表达式,这会导致包含[通配符元字符 的路径出现问题。
解决的办法是逸出的[作为`[; 例如,点源一个脚本,其路径为./test[1]/script.ps1:
# Note: '/' and '' can be used interchangeably in PowerShell.
. ./test`[1]/script.ps1
重要提示:如果路径是相对的,它必须以./或开头.(完整路径见下文)。
注意:[是通配符元字符,因为你可以用它来表示字符范围([a-z])或集合([56]);虽然]明明也是需要的,但是逃跑就足够了[。
这个不幸的要求也会影响其他上下文,是GitHub 问题 #4726的主题。
或者 - 奇怪的是 - 正如Theo 的有用答案所示,如果您使用完整路径,则不需要这种转义。
# Dot-source 'script.ps1` from the same location as the running
# script ($PSScriptRoot).
# (Use $PWD to refer to the *currrent* dir.)
# Because this results in a *full* path, there is no need to escape, strangely.
. $PSScriptRoot/script.ps1
[1] &,它可以调用任何命令并在子作用域中运行用 PowerShell 代码编写的命令,它不是调用所必需的;例如& ./path/to/script.ps1和./path/to/script.ps1是等价的;但是,&如果路径被引用和/或包含变量引用,则需要- 请参阅此答案。
回答
解决这个问题的方法似乎是使用第二个脚本的完整路径:
. (Join-Path -Path $PSScriptRoot -ChildPath 'SecondScript.ps1')
- @MathiasR.Jessen Join-Path 没有 `-LiteralPath` 参数..(经过测试并有效)