如何禁用/覆盖PowerShell点表示法



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'
    

最新更新