2013-02-22 30 views
5

bir dize geçirilmesi bakın Bu komut penceresi açar ama dizeleri açıldıktan sonra geçirilen değildirWindows komut satırından

Runtime rt = Runtime.getRuntime(); 
rt.exec("cmd /c start"); 
String[] cmd = {"LogParser", "Select top 10 * into c:\temp\test9.csv from application" }; 
rt.exec(cmd); 

aşağıda kodu. Birisi bana bu kodun neden dizeleri komut penceresine yerleştirmeyeceğini söyleyebilir mi?

+0

Ayrı komutlar olarak yürütülürler, yalnızca diğerinden önce çalıştırdığınız için ilgili değildir. –

+1

Bir çözümün yakınında değilsin.Bence en iyi bahisten bu komutlarla bir metin dosyası oluşturmak ve 'LogParser' komutlarını kabul etmektir. –

+0

Tamam - ama hepsini – user2065481

cevap

2

seçenek /C şu anlama gelir:

Carries out the command specified by the string and then terminates. yüzden diğer komut ayrılmış olarak ele alınır.

0

benim yorumunda söylediği gibi - Runtime.exec(string)javadoc itibaren

'diğer bir önce idam, çünkü onlar sadece ilgili olmayan ayrı komutlar olarak yürütülür' -

belirtilen yürütür ayrı bir süreçte komut ve argümanlar.

Sen komutu işlemek için cmd almak için komutlar birlikte zincire ihtiyaç, sana komut satırında yürütülen gerek komutları belirtmek için \k bayrağını kullanmak gerekir inanıyoruz.

Runtime rt = Runtime.getRuntime(); 
String start = "cmd /k "; 
String cmd = "LogParser;\n" Select top 10 * into c:\temp\test9.csv from application"; 
rt.exec(start + cmd); 

Pencerem olmadığı için test edilmedi, ancak buna benzer.

+0

OP, 'LogParser' için yazılan giriş olarak geçirilen' select' komutuna ihtiyaç duyar. –

+0

Tamam Bunu denedim & güzel derler ama hiçbir şey olmuyor gibi görünüyor Runtime rt = Runtime.getRuntime(); \t Dize başlangıcı = "cmd/k"; \t Dize cmd = "LogParser"; \t String cmd2 = "Uygulamadan c: \ temp \ test9.csv içine en iyi 10 * seç"; \t rt.exec (start + cmd + cmd2); – user2065481

1

OutputStreamWriter kullanın ve oluşturulan işlemin giriş akışına yazın.

Process p = Runtime.getRuntime().exec("cmd /K start") ; 
Writer w = new java.io.OutputStreamWriter(p.getOutputStream()); 
w.append(yourCommandHere); 

Ayrıca/K kullanılmasının nedeni: o zaman

/K Çalıştır komut ve CMD isteminde dönün.

Referans:

+0

... ve bu, cmd'nin ayrı bir işlem oluşturduktan hemen sonra tamamlanmasından dolayı başarısız olur. –

+0

, bir 'p.waitFor()' kullanıyor? –

+0

Teklifinizle ne olacağı, 'w'' cmd'nin standart girdisine Log LogParser' yerine - ekleyeceğinizdir, ki bu da herhangi bir şekilde dahil olmamanız anlamına gelir. –

0

http://ss64.com/nt/cmd.html Bu neden kullanmaz:

String[] cmd = { "cmd /c", "LogParser", 
     "Select top 10 * into c:\temp\test9.csv from application" }; 
rt.exec(cmd); 

exec yöntemle here hakkında daha fazla bilgi bulun.

+0

'select ...' LogParser' tarafından standart girdi üzerinden kabul edilen bir komuttur. –

+0

Dize [] cmd = {"cmd/c", "LogParser", "Uygulamadan c: \ temp \ test9.csv içine en iyi 10 * seç"}; Bu, yürütme sırasında bir derleme hatası döndürür (belirtilen dosyayı bulamıyor) – user2065481

0

İlk iki satırda yaptığınız gibi bir işlemi başlatmanız gerekir, ancak start'u kullanmazsınız, çünkü bu ayrı bir işlem oluşturur ve hemen döner. Bunun yerine sadece LogParser kullanın veya LogParser işleminizi cmd içermeden başlatır. Bundan sonra, exec tarafından oluşturulan Process nesnesinin OutputStream kodunu almanız ve buna select komutunu yazmanız gerekir. Yanıtı görmek için Process s InputStream'dan da okumanız gerekecektir. Bunların hiçbiri ayrı bir komut istemi penceresinde görünecektir; Java ile her şeyi işlemek zorunda kalacaksınız ve ayrıca bazı çok iş parçacıklarını da içerecek.

+0

Teşekkürler Marko. Bu konuda en çok şey biliyorsunuz. Çözümünüzün çalıştığını varsayardım ama en az 3 aylık Java deneyimime sahip olduğum gerçeğini belirtmek zor geliyor. – user2065481

+0

“LogParser” 'ı bir argüman olarak' select 'yapıp yapamayacağınızı görün. Bu, işleri çok daha kolaylaştıracaktır. Başarısız olursanız, bir dosyadan komutlarını okuyabildiğini görün. Belki de "echo" gibi bir şeyi deneyebilirsiniz ... "| LogParser'. –