Çalışma zamanı, boşluk içeren değişkenlerle yürütülür

Bir Runtime.exec() çağrısı ile çalıştırmaya çalıştığım bir uygulama var.

Bazı argümanların boşlukları olduğundan, hem Linux hem de Windows'ta çalışacak şekilde argümanları nasıl düzgün bir şekilde çıkarabilirim? Windows ile biliyorum, linux eğik çizgi kullanırken, genellikle boşluk içeren bir dize etrafında çift tırnak kullanırsınız.

Boşluklarla çalıştırdığım programın (Windows xcopy for şimdilik) hemen dönmesini ve parametre sayısının yanlış olduğunu göstermesini beklerdim. Ancak waitFor() çağrısı askıda kalıyor.

String[] commandArray = new String[3];
commandArray[0] = applicationPath;
commandArray[1] = someFileWhichMayHaveSpaces;
commandArray[2] = anotherFileWhichMayHaveSpaces;

Process appProcess = Runtime.getRuntime().exec(commandArray);
int returnCode = appProcess.waitFor();
2
Aynı argü listesine sahip ProcessBuilder cihazına geçmenin etkisi yoktur.
katma yazar Stealth Rabbi, kaynak
Aynı argü listesine sahip ProcessBuilder cihazına geçmenin etkisi yoktur.
katma yazar Stealth Rabbi, kaynak
ProcessBuilder 'a geçin
katma yazar Jigar Joshi, kaynak
ProcessBuilder 'a geçin
katma yazar Jigar Joshi, kaynak
@Richard: Belirli bir uygulamanın komut satırı dizesini nasıl ayrıştırdığını bilmiyorsanız, Windows'ta bir diziyi hedef uygulamaya geçirmenin güvenli bir yolu yoktur.
katma yazar Harry Johnston, kaynak
@Richard: Belirli bir uygulamanın komut satırı dizesini nasıl ayrıştırdığını bilmiyorsanız, Windows'ta bir diziyi hedef uygulamaya geçirmenin güvenli bir yolu yoktur.
katma yazar Harry Johnston, kaynak
Runtime.exec() işlevini kullanırken bağımsız değişkenlerden kaçmanız gerektiğini düşünmüyorum. Parametreler herhangi bir değişiklik yapılmadan doğrudan hedef uygulamaya aktarılmalıdır.
katma yazar Richard, kaynak
Runtime.exec() işlevini kullanırken bağımsız değişkenlerden kaçmanız gerektiğini düşünmüyorum. Parametreler herhangi bir değişiklik yapılmadan doğrudan hedef uygulamaya aktarılmalıdır.
katma yazar Richard, kaynak

6 cevap

Birkaç hafta önce geliştirdiğim uygulama ile aynı sorunu yaşadım. Sonunda, ham Runtime.exec() ( Runtime.exec() 'ın tuzakları ve Apache Commons Exec kütüphanesini kullanmaya karar verdi. Uygulama sırasında çeşitli problemlerin kutudan çıkarılıp rasgele askıya alınmasına yardımcı oldu. Onun addArguments() yöntemi handleQuoting parametresini alır, bu nedenle işletim sistemini kontrol eden basit bir kullanım yöntemi oluşturdum ve Linux için yanlış yaptığım sırada Windows için fiyat teklifi almayı talep ediyorum. Bazı çalışma örnekleri istiyorsanız, kütüphane web sitesinde bazı dersler bulunmaktadır. Ayrıca LaTeX Studio'yu Açın projesi.

3
katma

Birkaç hafta önce geliştirdiğim uygulama ile aynı sorunu yaşadım. Sonunda, ham Runtime.exec() ( Runtime.exec() 'ın tuzakları ve Apache Commons Exec kütüphanesini kullanmaya karar verdi. Uygulama sırasında çeşitli problemlerin kutudan çıkarılıp rasgele askıya alınmasına yardımcı oldu. Onun addArguments() yöntemi handleQuoting parametresini alır, bu nedenle işletim sistemini kontrol eden basit bir kullanım yöntemi oluşturdum ve Linux için yanlış yaptığım sırada Windows için fiyat teklifi almayı talep ediyorum. Bazı çalışma örnekleri istiyorsanız, kütüphane web sitesinde bazı dersler bulunmaktadır. Ayrıca LaTeX Studio'yu Açın projesi.

3
katma

Görünüşe göre en azından Windows ortamında yapılan testlerde, boşluklarda herhangi bir sorun bulunmuyor. Sorun, kopyalama kaynağının bir dosya veya dizin olması durumunda, xcopy'nın bir soruya cevap vermesini istemesi/durdurmasıydı. Uzayları boğduğunu sanmıştım, ama görünüşe göre değildi. Sorudaki kodları kullanabildim ve ProcessBuilder'ı kullanmak zorunda değildim.

0
katma

Görünüşe göre en azından Windows ortamında yapılan testlerde, boşluklarda herhangi bir sorun bulunmuyor. Sorun, kopyalama kaynağının bir dosya veya dizin olması durumunda, xcopy'nın bir soruya cevap vermesini istemesi/durdurmasıydı. Uzayları boğduğunu sanmıştım, ama görünüşe göre değildi. Sorudaki kodları kullanabildim ve ProcessBuilder'ı kullanmak zorunda değildim.

0
katma

Windows'ta şüpheniz varsa, komut satırı argümanı olarak dize dizisi yerine dize alan Runtime.exec aşırı yüklemelerinden birini kullanmanız gerekir. Bu, yeni işlem için komut satırı dizesini kendiniz oluşturmanıza olanak sağlar, böylece sözdiziminin doğru olduğundan emin olabilirsiniz.

Dizi yöntemini kullanırsanız, Java diziyi tek bir dizeye dönüştürmek zorundadır. Bunu, hedef işlemin Microsoft C çalışma zamanı komut satırı ayrıştırıcısını (veya uyumlu bir) kullandığını varsayan standart algoritmayı kullanarak yapar. Bu genellikle olacaktır, ancak her zaman değil.

0
katma

Windows'ta şüpheniz varsa, komut satırı argümanı olarak dize dizisi yerine dize alan Runtime.exec aşırı yüklemelerinden birini kullanmanız gerekir. Bu, yeni işlem için komut satırı dizesini kendiniz oluşturmanıza olanak sağlar, böylece sözdiziminin doğru olduğundan emin olabilirsiniz.

Dizi yöntemini kullanırsanız, Java diziyi tek bir dizeye dönüştürmek zorundadır. Bunu, hedef işlemin Microsoft C çalışma zamanı komut satırı ayrıştırıcısını (veya uyumlu bir) kullandığını varsayan standart algoritmayı kullanarak yapar. Bu genellikle olacaktır, ancak her zaman değil.

0
katma
Windows
Windows
729 Katılımcıların

Windows ile ilgili tüm sorunların çözümüne yanıt arandığı ve paylaşımların yapıldığı bir gruptur. @SerCiTV @Tekpay @Apktanitim kanal/grupların uzantısıdır. https://t.me/joinchat/H1pwvUwqv4etCBtv9Oi_qQ