ben pencerelerde ve unix içinde mono altında çalıştırmak için gereken bir C# komut satırı uygulaması vardır (Ya yasal arg dizeye agrv dönüştürmek). Bir noktada, komut satırından geçirilen bir dizi keyfi paramater verilen bir alt işlem başlatmak istiyorum. Örneğin: C# içinde bir argv ile bir alt işlemi nasıl başlatırım?
Usage: mycommandline [-args] -- [arbitrary program]
Maalesef System.Diagnostics.ProcessStartInfo sadece args için bir dize alır. Bu gibi komutlar için bir sorundur:
Bu durumda argv ise
./my_commandline myarg1 myarg2 -- grep "a b c" foo.txt
benziyor: Ben sadece argümanlar bitiştirmek eğer öyleyse tırnak etrafında "abc" kabuk tarafından soyulduğunu
argv = {"my_commandline", "myarg1", "myarg2", "--", "grep", "a b c", "foo.txt"}
Not ProcessStartInfo için arg dizesini oluşturmak için şunu elde ederim:
args = "my_commandline myarg1 myarg2 -- grep a b c foo.txt"
İstediğim bu değil.
C# OR altında bir argv'yi alt işlem başlatmaya geçirmenin basit bir yolu var mıdır, isteğe bağlı bir argvayı windows ve linux kabuğu için yasal olan bir dizeye dönüştürmek için?
Herhangi bir yardım büyük memnuniyetle karşılanacaktır.
Sadece bir not: Windows'un teknik olarak bir argv'si olmadığı için C# üstünde bu sorun yok. Komut satırının tamamı işleme aktarılır ve argümanların ayrılması, işletim sisteminin değil, yeni sürecin görevidir.Unix, karşı yaklaşımı benimsiyor: İşletim sistemi bir dizi dizeden geçmekten sorumlu, bu yüzden joker karakter genişletme gibi şeyler çağrı işlemiyle halledilebilir. –
@DanielPryden bu doğru değil. windows programları POSIX olanlar gibi bir argv listesine sahiptir. .Net sadece bu listeyi kayıtsızca gizler. Bana sorarsan çok rahatsız edici olur. – IanNorton
@IanNorton: Aksine, "CreateProcess" sadece tek bir argüman dizesi alır. Microsoft C Çalıştırıcısı (MSVCRT) bu dizeyi ayrıştırır ve onu argv olarak kullanıma sunar, ancak programların CRT uygulamasını kullanması gerekmez ve CRT'nin başlatılması için kullanılan aynı belirti kümesini döndürmenin ayrıştırılmasının garanti edilmez. süreç. –