PowerShell中的命令几乎像Bash,但点表示法的扩展为我带来了很多工作。目前,我必须用引号包装很多命令参数:
.mvnw.cmd -Dmaven.repo.local=.m2/repository deploy:deploy-file -Durl=http://zippo:8081/repository/grinch/ -DrepositoryId=nexus -DgroupId=com.zippo -DartifactId=test -Dversion=1.0 -Dpackaging=jar -Dfile=test-1.0.jar
成为
.mvnw.cmd -D"maven.repo.local"=".m2/repository" deploy:deploy-file -Durl=http://zippo:8081/repository/grinch/ -DrepositoryId=nexus -DgroupId="com.zippo" -DartifactId=test -Dversion="1.0" -Dpackaging=jar -Dfile="test-1.0.jar"
如何禁用点表示法,或者覆盖点运算符,用其他东西替换它,等等。?
如何禁用点表示法?
-
问题不在于点表示法,它是PowerShell如何解析要传递给外部程序的参数的错误:
- 像
-foo.bar
这样的令牌被意外地分解成两个参数-foo
和.bar
-请参阅GitHub问题#6291(意外重复:GitHub第15541号问题(;这只是几个相关错误中的一个,至少在PowerShell 7.3.6之前存在
- 像
-
确实需要转义或引用来解决此问题,但您可以通过
`
-转义每个受影响参数的初始-
或将每个作为一个整体封装在'...'
中(或"..."
,如果需要字符串插值(来简化:# `-escape the initial - of all affected arguments. .mvnw.cmd `-Dmaven.repo.local=.m2/repository deploy:deploy-file -Durl=http://zippo:8081/repository/grinch/ -DrepositoryId=nexus `-DgroupId=com.zippo -DartifactId=test `-Dversion=1.0 -Dpackaging=jar `-Dfile=test-1.0.jar # Alternative: Quote the affected arguments. .mvnw.cmd '-Dmaven.repo.local=.m2/repository' deploy:deploy-file -Durl=http://zippo:8081/repository/grinch/ -DrepositoryId=nexus '-DgroupId=com.zippo' -DartifactId=test '-Dversion=1.0' -Dpackaging=jar '-Dfile=test-1.0.jar'
如果您不想考虑哪些特定的参数可能会受到影响,请引用它们all,再加上您可以使用数组子表达式运算符
@(...)
将参数作为字符串的数组传递,可以通过将其扩展到多行来提高长命令的可读性:.mvnw.cmd @( '-Dmaven.repo.local=.m2/repository' 'deploy:deploy-file' '-Durl=http://zippo:8081/repository/grinch/' '-DrepositoryId=nexus' '-DgroupId=com.zippo' '-DartifactId=test' '-Dversion=1.0' '-Dpackaging=jar' '-Dfile=test-1.0.jar' )
备选方案:
-
您可以使用
--%
,这是一种停止解析令牌,无需引用,但请注意其许多局限性——尤其是无法(直接(将PowerShell变量和表达式合并到命令中——有关详细信息,请参阅此答案。# --% passes the remainder of the command line as-is to the target program .mvnw.cmd --% -Dmaven.repo.local=.m2/repository deploy:deploy-file -Durl=http://zippo:8081/repository/grinch/ -DrepositoryId=nexus -DgroupId=com.zippo -DartifactId=test -Dversion=1.0 -Dpackaging=jar -Dfile=test-1.0.jar
-
您可以通过
cmd /c
调用,在这种情况下,您可以引用整个命令行,这样可以避免解析错误(但请注意,字符串中指定的命令必须满足cmd.exe
的语法规则;它们可能与PowerShell的语法规则不同,尽管在本例中并非如此(:cmd /c '.mvnw.cmd -Dmaven.repo.local=.m2/repository deploy:deploy-file -Durl=http://zippo:8081/repository/grinch/ -DrepositoryId=nexus -DgroupId=com.zippo -DartifactId=test -Dversion=1.0 -Dpackaging=jar -Dfile=test-1.0.jar'