Ho un'applicazione di riga di comando C# che devo eseguire in Windows e in mono in Unix. Ad un certo punto voglio avviare un sottoprocesso dato un insieme di parametri arbitrari passati attraverso la riga di comando. Per esempio:Come posso avviare un sottoprocesso in C# con un argv? (Oppure convertire agrv in una stringa di argomento legale)
Usage: mycommandline [-args] -- [arbitrary program]
Purtroppo, System.Diagnostics.ProcessStartInfo richiede solo una stringa per args. Questo è un problema per i comandi come:
./my_commandline myarg1 myarg2 -- grep "a b c" foo.txt
In questo caso argv assomiglia:
argv = {"my_commandline", "myarg1", "myarg2", "--", "grep", "a b c", "foo.txt"}
Si noti che le virgolette intorno "abc" vengono eliminati dalla shell, quindi se ho semplicemente concatenare i argomenti al fine di creare la stringa arg per ProcessStartInfo ottengo:
args = "my_commandline myarg1 myarg2 -- grep a b c foo.txt"
che non è quello che voglio.
C'è un modo semplice per passare un argv al sottoprocesso di avvio in C# OR per convertire un argv arbitrario in una stringa che è legale per windows e shell di Linux?
Qualsiasi aiuto sarebbe molto apprezzato.
Solo una nota: C# su Windows non presenta questo problema perché Windows non ha tecnicamente un argv. L'intera riga di comando viene passata al processo e la suddivisione degli argomenti è il lavoro del nuovo processo, non del sistema operativo.Unix ha l'approccio opposto: il sistema operativo è responsabile del passaggio di una serie di stringhe, pertanto elementi come l'espansione dei caratteri jolly possono essere gestiti dal processo di chiamata. –
@DanielPryden che non è vero. i programmi Windows hanno una lista argv come quelli POSIX. .Net nasconde semplicemente questo elenco. Piuttosto irritante se me lo chiedi. – IanNorton
@IanNorton: al contrario, 'CreateProcess' accetta solo una singola stringa di argomenti. Il Microsoft C Runtime (MSVCRT) analizza quella stringa e la rende disponibile come argv, ma i programmi non sono richiesti per utilizzare l'implementazione CRT e l'analisi eseguita dal CRT non garantisce il ritorno dello stesso insieme di token che sono stati utilizzati per il lancio il processo. –