无法在 Microsoft Powershell 中使用“mvn -D”参数运行 Maven,但可以在命令提示符下运行

Posted

技术标签:

【中文标题】无法在 Microsoft Powershell 中使用“mvn -D”参数运行 Maven,但可以在命令提示符下运行【英文标题】:Cannot run Maven using `mvn -D` argument within Microsoft Powershell, but works in Command Prompt 【发布时间】:2011-09-14 22:25:31 【问题描述】:

我正在尝试从命令行构建我们的 Web 项目,但跳过了测试。我正在使用命令mvn clean install -Dmaven.test.skip=true

当我从传统的黑白命令提示符(又名 DOS shell)运行命令时,该命令有效,但是当我从“Windows PowerShell”命令运行它时,我收到以下错误:

[ERROR] Unknown lifecycle phase ".test.skip=true". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin- artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepar e-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-site, site, post-site, site-deploy, pre-clean, clean, po st-clean. -> [Help 1]

造成这种差异的原因是什么?如何让 PowerShell 像传统的命令提示符一样工作?

这是在 Windows 7 上运行的。

【问题讨论】:

【参考方案1】:

当您遇到 PowerShell 对要传递给控制台 EXE 的参数的解释问题时,请尝试使用 PowerShell Community Extensions 附带的 echoargs.exe 实用程序。使用此工具,您可以了解 PowerShell 如何为 EXE 提供参数,例如:

PS> echoargs mvn clean install -Dmaven.test.skip=true
Arg 0 is <mvn>
Arg 1 is <clean>
Arg 2 is <install>
Arg 3 is <-Dmaven>
Arg 4 is <.test.skip=true>

PS> echoargs mvn clean install '-Dmaven.test.skip=true'
Arg 0 is <mvn>
Arg 1 is <clean>
Arg 2 is <install>
Arg 3 is <-Dmaven.test.skip=true>

简答 - 使用引用'-Dmaven.test.skip=true'

【讨论】:

刚刚碰到这个。在 '=' 和 '.' 上拆分参数有什么可能的原因?对我来说似乎完全愚蠢。 好答案。知道为什么 powershell 在第一个时期分裂 -Dmaven.test.skip=true 而不是后续时期吗? 是否有必要对所有出现的 args 破折号使用反引号,还是 Maven 特定的?这也适用于 git dash 命令吗? 当我遇到特定于 Windows 的问题时,这让我很伤心 另一种方法是使用--% 运算符,这会使Windows 上的PowerShell 解析得更像cmd.exe。请注意,您不会获得 $var 替换等 PS 功能。如果您需要 var 替换,您可以使用 env vars 例如:$env:SKIPTEST='true'; mvn --% clean install -Dmaven.test.skip=%SKIPTEST%【参考方案2】:

以下对我有用。

$mvnArgs1 ="mvn test -X -Dmaven.test.skip=true".replace('-D','`-D')
Invoke-Expression $mvnArgs1

看起来 -D 是一种特殊字符,需要转义。 另请注意,–X 可以正常工作并且不需要转义。 注意替换命令中使用单引号,如果使用双引号(即“),则需要使用``。

我在 Windows 7 上使用 Powershell 2.0 (2.0.1.1)

【讨论】:

【参考方案3】:

根据this email thread:

通常,如果您使用 Powershell for Maven、svn 等,您最终会 必须转义以破折号 (-) 开头的任何参数。这 Powershell 中的转义字符是一个反引号。所以你最终得到 mvn 原型:创建`-DgroupId=blah`-DartifactId=blah。 , '-' 是一个 运行时需要用反引号转义的特殊字符 来自 Powershell 控制台的 maven。

【讨论】:

以上是关于无法在 Microsoft Powershell 中使用“mvn -D”参数运行 Maven,但可以在命令提示符下运行的主要内容,如果未能解决你的问题,请参考以下文章

将SharePoint Online Client组件(Microsoft.SharePoint.Client)与powershell 2.0一起使用

Microsoft Office setup找不到powershell

无法在 PowerShell 中使用 REST API 删除 DevOps 分支

作为计划任务运行时,Powershell 脚本无法访问文件

如何确定 microsoft 故障转移群集是不是具有仲裁(在 powershell 中)

powershell Microsoft.PowerShell_profile