Gradle:使用多个带有空格参数的任务“type:Exec”执行任务。

7

我有一个Gradle任务,应该在Windows操作系统上创建Websphere配置文件

task createProfile(type:Exec) {

    def commandToExecute = new StringBuffer()
    def profile = 'AppSrv02'
    def wasHome = 'C:/IBM new/WebSphere/AppServer'

    def str = new LinkedList <String> ();
    str.add('cmd')
    str.add('/c')
    str.add(wasHome + '/bin/manageprofiles.bat')
    str.add('-create')
    str.add('-profileName')
    str.add(profile)
    //str.add('-templatePath')
    //str.add(wasHome + '/profileTemplates/default')

    println (str)
    commandLine str.toArray()

}

如果我取消注释掉的行,问题就出现了,任务失败并告诉我:"C:/IBM"不是有效的批处理文件。如果我把profileTemplates放在不包含空格的文件夹中,一切都正常了。但模板应该位于wasHome中(有时wasHome也有空格)。目前我还不知道为什么添加带有空格的templates键和值会影响Gradle以这种方式尝试启动"C:/IBM",而不是指定的'C:/IBM new/WebSphere/AppServer/bin/manageprofiles.bat'。可能问题在java.lang.ProcessBuilder内部。我尝试通过添加"/""来引用路径,但是什么都不起作用((((这并不奇怪,因为ProcessBuilder会根据需要自行引用。所以,我想问问是否有人遇到过类似的问题,并能推荐如何解决这个问题?提前感谢您的帮助。
3个回答

11
如果有人需要的话,我们已经找到了解决这个问题的方法。最终任务看起来是这样的:
task createProfile(type: Exec) {
    executable = new File(wsadminLocation, manageProfilesFileName)
    def templatePath = wasHome + File.separator + "profileTemplates" + File.separator + "default"
    def argsList = ["-create", "-profileName", profile, "-templatePath", templatePath, "-nodeName", nodeName, "-cellName", wasCellName, "-enableAdminSecurity", isProfileSecured, "-adminUserName", rootProject.wasLogin, "-adminPassword", rootProject.wasPassword]
    args = argsList
}

基本思想是将参数传递给Gradle而不是作为长字符串,而是作为列表。因此,如果参数包含空格,就不会出现任何问题。

这个解决方案对我没用。我有一个参数,例如 --autoprefix="last 2 versions",双引号之间的空格总是导致问题。 - Michael R

3

修改以下行:

def wasHome = '"C:/IBM new/WebSphere/AppServer'
...
str.add(wasHome + '/bin/manageprofiles.bat"')

这样,批处理文件的完整路径会被引用。

编辑 - 正如dbenhan所述,有点含糊不清。这个“应该”是像这样的

task createProfile(type:Exec) {

    def commandToExecute = new StringBuffer()
    def profile = 'AppSrv02'
    def wasHome = 'C:/IBM new/WebSphere/AppServer'

    def str = new LinkedList <String> ();
    str.add('cmd')
    str.add('/c')
    str.add('"' + wasHome + '/bin/manageprofiles.bat"')
    str.add('-create')
    str.add('-profileName')
    str.add(profile)
    str.add('-templatePath')
    str.add('"' + wasHome + '/profileTemplates/default"')

    println (str)
    commandLine str.toArray()

}

然而,虽然Gradle特别是Windows都可以处理斜杠分隔符的路径,但我不知道manageprofiles.bat是否可以处理这种路径,并且你正在传递一个带有路径的参数。也许你需要将你的路径更改为'c:\\IBM new\\....'


+1,或许稍微简化一下:str.add('"'+wasHome+'/bin/manageprofiles.bat"') - dbenham
@dbenham: 我知道。但这样可以取消注释以下两行并使用str.add(wasHome + '/profileTemplates/default"')重用初始引号(开个玩笑,你是对的;-)) - MC ND
尝试了两种方法,结果还是一样(((( 仍然无法正常工作,不知道为什么无法完美地完成,使用Gradle也无法成功。 - serg
很遗憾,没有结果(我加了引号:无结果,更改了斜杠:再次无效)。即使println打印了[cmd,/c,“C:\IBM new\WebSphere\AppServer\bin\manageprofiles.bat”,-create,-profileName,AppSrv02,-templatePath,“C:\IBM new\WebSphere\AppServer\profileTemplates\default”],但命令行仍然显示“C:\IBM”不是有效的命令或其他错误。 - serg

1
尝试这个。
task xyz {
def result1 = exec {
            workingDir "D:/abc/efg"
            commandLine 'cmd', '/c', 'CDUTIL.bat', "qwe", "rty"
        }

        println result1.toString()
}

这绝对适用于Gradle 3.5和Groovy。 - yolob 21

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接