2013-12-16 19 views
5

mam Gradle zadanie, które powinno stworzyć profil WebSphere w systemie operacyjnym WindowsGradle: Wykonanie zadania „typ: Exec” z wielu argumentów ze spacjami

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() 

} 

a problem pojawia się, gdy ja odkomentowaniu komentowane linii, po nim zadań nie powiedzie się i powie: "C:/IBM" nie jest prawidłowym plikiem wsadowym. Jeśli umieściłem profileTemplates nie w folderze zawierającym spacje, wszystko działa poprawnie. Ale szablony powinny kłamać int byłoHome (I czasami byłoHome ma spacje (

Mam, teraz pomysły, dlaczego dodawanie klucz do szablonów z wartością ze spacjami wpływa w taki sposób, że Gradle próbuje uruchomić "C:/IBM" zamiast tego określiło "C:/IBM/WebSphere/AppServer/bin/manageprofiles.bat 'Wydaje się, że prawdopodobnie problem występuje wewnątrz java.lang.ProcessBuilder.

Próbuję cytować ścieżki, dodając "/"", ale nic nie działa (((co nie jest zaskoczeniem, ponieważ ProcessBuilder implikuje sam cytowanie, jeśli jest to potrzebne:

Pytam więc, czy ktoś miał podobny problem i mógł zalecić, jak obejść ten problem? Z góry dziękuję.

Odpowiedz

7

Jeśli ktoś tego potrzebował, znaleźliśmy obejście tego problemu. Zadanie ostatecznie wygląda następująco:

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 
} 

Podstawową ideą jest przekazanie argumentów do Gradle nie jako długiego ciągu, ale jako listy. W ten sposób nie ma żadnych problemów, jeśli argument zawiera spację.

+0

To rozwiązanie nie działa dla mnie.Miałem argument taki jak" --autoprefix = " ostatnie 2 wersje "', a przestrzenie pomiędzy podwójnymi cytatami zawsze wyrzucały rzeczy. –

2

Zmiany następujące linie

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

ten sposób pełną ścieżkę do pliku wsadowego jest cytowany.

EDYTOWANA - Jak podaje dbenhan, trochę zaciemniona. Ten „powinno” być coś

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() 

} 

Jednak, gdy Gradle w szczególności i okien w ogóle może obsługiwać trasy z separatorami ukośnymi, nie mam pojęcia, czy manageprofiles.bat może i są przechodzącą parametr ze ścieżką w nim . Być może, będziesz musiał zmienić ścieżki do 'c:\\IBM new\\....'

+0

+1, lub być może nieco mniej ukrywane: 'str.add (' " '+ wasHome +'/ bin/manageprofiles.bat"')' – dbenham

+0

@dbenham: Wiem. Ale to pozwala odkomentować następujące dwa wiersze i użyć 'str.add (wasHome + '/ profileTemplates/default"') 'ponowne użycie początkowego cytatu (tylko żartujesz, masz rację ;-)) –

+0

wypróbował oba, wciąż ten sam wynik ((((nadal nie działa, w jakiś sposób mrówka robi to doskonale, z gradle Nie uda mi się osiągnąć sukcesu – serg

0

Try To

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

     println result1.toString() 
} 
Powiązane problemy