2012-05-30 1 views
16

In .NET, è possibile accedere facilmente agli argomenti della riga di comando divisi in una serie di stringhe dall'argomento di Main(string[]) o Environment.GetCommandLineArgs(). Tuttavia, c'è un modo per ottenere la riga di comando non analizzata come una stringa?Ottenere la riga di comando non elaborata (unsplit) in .NET

Sfondo: la mia app si aggiunge al menu di scelta rapida FileExplorer (come fa Notepad ++). Quando viene lanciato in questo modo, il nome file viene passato senza virgolette, il che significa che se ci sono spazi nel percorso, è suddiviso. So che posso risolvere questo problema abbracciando %1 tra virgolette nel registro come myapp.exe "%1", ma quando controllo il registro di altre applicazioni non lo fanno. Sono chiari come notepad.exe %1 - hanno ottenuto la riga di comando completa. Voglio sapere se è possibile in .NET e come.

risposta

22

Provare a utilizzare Environment.CommandLine

+0

C'è un modo per rimuovere facilmente il nome dell'eseguibile da questo? –

+1

@ JaredBeach, .Replace (Application.ExecutablePath, "") –

4

Prova:

Environment.CommandLine

questo meglio lo rendono a 30 caratteri.

3

Per ottenere la riga di comando non analizzata, non elaborata, è necessario P/Invoke GetCommandLine dal kernel32. Alcune analisi verranno eseguite dal sistema operativo. Ad esempio, un reindirizzamento IO come >foo.txt verrà escluso dal testo della riga di comando indipendentemente dalla tecnica utilizzata.

Environment.CommandLine può essere sufficiente, ma tenere presente che rimuove gli spazi interstiziali tra gli argomenti (a meno che l'argomento stesso non sia racchiuso tra virgolette) e rimuova le virgolette dagli argomenti citati.

Ad esempio, per la linea di comando:

test.exe this is "a test"

Environment.CommandLine è uguale: "this is a test"

Ma i rendimenti GetCommandLine: "test.exe this is "a test"" con gli spazi e le citazioni intatte, insieme con il percorso dell'exe.

Nota: che quando si utilizza questa tecnica, è necessario analizzare manualmente il testo della riga di comando, che può comportare la rimozione del percorso dell'exe, che può essere racchiuso tra virgolette se il percorso contiene spazi.

+1

Huh, non mostrare il comportamento che descrivi. 'Environment.CommandLine' corrisponde a' PInvoke' in tutti i casi che cerco. –

+0

Ottengo anche lo stesso risultato da 'Environment.CommandLine' come da PInvoke in .NET 4.5.2. – DeCaf

+0

Hai ragione. Entrambi stanno dando gli stessi risultati sulla mia attuale configurazione di sistema. Non ho rintracciato l'app di esempio e il sistema che ho usato per testarlo (è stato un anno fa), ma se è stato mai rotto, deve essere stato da una versione precedente di OS + .NET + Compiler rispetto a quella attuale. Questo può valere solo per un aggiornamento più vecchio di VS, per esempio. Non sono sicuro di quali versioni. Quando avrò la possibilità, cercherò di capire quali versioni ho usato. Indipendentemente da ciò, hai ragione che non è evidente nel software attuale. Forse c'è stata una correzione di bug ad un certo punto? Non posso concludere che non fosse vero ad un certo punto. Grazie. – Wyck