2016-06-27 39 views
9

Quando si esegue csi.exe /? (Con Visual Studio 2015 aggiornamento 2 installato), si otterrà la seguente sintassiCome utilizzare l'argomento script CSI.exe

Microsoft (R) Visual C# Interactive Compiler version 1.2.0.51106 
Copyright (C) Microsoft Corporation. All rights reserved. 

Usage: csi [option] ... [script-file.csx] [script-argument] ... 

Mi chiedo solo come posso passare questo [script argomento] nel mio file di script CSX. Diciamo, il mio script CSX (c: \ temp \ a.csx) ha solo 2 riga come segue

using System; 
Console.WriteLine("Hello {0} !", <argument_from_commandLine>); 

Quello che mi aspetto è dopo ho eseguito il seguente riga di comando

csi.exe c:\temp\a.csx David 

mi metterò

Hello David ! 

Ma io non so che cosa devo fare nel mio file di script in modo da poter passare il csi.exe [script_argument] al mio file di script (in sostituzione).

Grazie in anticipo per il vostro tempo e aiuto.

+0

Si prega di considerare la risposta in alto come accettata. – binki

risposta

11

C'è una variabile globale negli script denominata Args che ha questi valori "argomento script". La cosa più vicina che riesco a trovare nella documentazione è menzionarla in pull requests for the roslyn repo. In un file CSX (test.csx):

using System; 
Console.WriteLine("Hello {0}!", Args[0]); 

utilizzando la riga di comando:

csi.exe test.csx arg1 

darà l'output:

Ciao arg1!

Un approccio alternativo che utilizza Environment.GetCommandLineArgs() può essere eseguito per funzionare, ma il problema è che questo preleva tutti gli argomenti passati al processo csi. Quindi devi separare gli "argomenti dello script" dalle opzioni per csi stesso. Questo lavoro può essere evitato usando la variabile integrata Args che sarà anche più manutenibile.

+0

Questo è esattamente quello che voglio. In realtà ho provato questo metodo, ma sfortunatamente ho usato args [0], cioè non in maiuscolo Args [0], quindi ho ricevuto l'errore "Il nome 'args' non esiste nel contesto corrente". Grazie mille @ mike. – jyao

+0

@jyao: Ho appena provato questo e 'Args [0]' funziona esattamente come descrive @mikez. –

+0

@binki vedere i miei aggiornamenti –

0

È possibile utilizzare Environment.GetCommandLineArgs() per quello.

Esempio per il tuo esempio:

using System; 
Console.WriteLine("Hello {0}!", Environment.GetCommandLineArgs()[2]); 

Si noti che sto leggendo il terzo elemento, perché Environment.GetCommandLineArgs() dà l'intera riga di comando (se si esegue lo script utilizzando csi test.csx David, il primo sarà csi e il secondo test.csx)

+0

Grazie a @zdimension, sembra una soluzione. – jyao

+1

Anche se questo potrebbe funzionare per casi semplici, se si prevede di passare più opzioni di riferimento o lib in csi, l'indice non sarà 2 (o uniforme tra le esecuzioni). C'è un modo più diretto per accedere agli argomenti dello script come mostro nella mia risposta. –