gradle: выполнить тип задачи: Exec со многими аргументами с пробелами

У меня есть задача gradle, которая должна создать профиль Websphere в ОС Windows.

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 есть пробелы(

Теперь у меня есть идеи, почему добавление ключа шаблонов со значением с пробелами влияет таким образом, что Gradle пытается запустить «C:/IBM» вместо указанного «C:/IBM new/WebSphere/AppServer/bin/manageprofiles.bat». Похоже, что, возможно, проблема внутри java.lang.ProcessBuilder.

Я пытаюсь заключать пути в кавычки, добавляя "/"" , но ничего не работает(((( что неудивительно, потому что ProcessBuilder сам подразумевает цитирование, если это необходимо.

Итак, я спрашиваю, была ли у кого-нибудь аналогичная проблема и мог бы порекомендовать, как обойти эту проблему? Заранее спасибо.


person serg    schedule 16.12.2013    source источник


Ответы (3)


Если кому-то это было нужно, мы нашли обходной путь для этой проблемы. В итоге задача выглядит так:

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 не в виде длинной строки, а в виде списка. Таким образом, нет никаких проблем, если аргумент содержит пробел.

person serg    schedule 23.04.2014
comment
Это решение не сработало для меня. У меня был такой аргумент, как --autoprefix="last 2 versions", и пробелы между двойными кавычками всегда сбивали с толку. - person Michael R; 04.02.2016

Изменить следующие строки

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

Таким образом, полный путь к пакетному файлу указывается в кавычках.

EDITED - Как заявил 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 в частности и окна в целом могут обрабатывать пути с разделителями косой черты, я понятия не имею, может ли manageprofiles.bat, и вы передаете параметр с путем в нем. Возможно, вам нужно будет изменить свои пути на 'c:\\IBM new\\....'

person MC ND    schedule 16.12.2013
comment
+1 или, возможно, немного менее запутанно: str.add('"'+wasHome+'/bin/manageprofiles.bat"') - person dbenham; 16.12.2013
comment
@dbenham: я знаю. Но это позволяет раскомментировать следующие две строки и использовать str.add(wasHome + '/profileTemplates/default"'), повторно используя начальную кавычку (шучу, вы правы ;-)) - person MC ND; 16.12.2013
comment
попробовал оба, все тот же результат (((( все еще не работает, как-то муравей делает это отлично, с градиентом мне не удалось добиться успеха. - person serg; 16.12.2013
comment
к сожалению, нет( я добавил кавычки: нет результата, изменил слэши: опять ничего › Даже println печатает [cmd, /c, C:\IBM new\WebSphere\AppServer\bin\manageprofiles.bat, -create, -profileName, AppSrv02, -templatePath, C:\IBM new\WebSphere\AppServer\profileTemplates\default], все равно в командной строке написано, что C:\IBM недопустимая команда или что-то в этом роде - person serg; 16.12.2013

Попробуй это

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

        println result1.toString()
}
person Singhak    schedule 19.09.2017
comment
это определенно работает с gradle 3.5 и groovy - person yolob 21; 19.05.2021