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'
Run Code Online (Sandbox Code Playgroud)
如果您不想考虑哪些特定参数可能会受到影响,请将它们全部引用,结合您可以将参数作为字符串数组传递的事实,使用数组子表达式运算符@(...)
-可以使用通过将长命令分散到多行中,使长命令更具可读性:
.\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'
)
Run Code Online (Sandbox Code Playgroud)
备择方案:
您可以使用--%
stop -parsing token,这消除了引用的需要,但请注意它的许多限制,特别是无法(直接)将 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
Run Code Online (Sandbox Code Playgroud)
您可以调用 viacmd /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'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
435 次 |
最近记录: |