我试图包括一个脚本内的另一个是在同一文件夹,使用点语法:
. '.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')
@Theo有一个有用的解决方案,但原因是[]
必须在路径中转义。
$path = 'C:path`[to`]script.ps1'