2010-11-11 19 views
7

Ho alcune domande sull'argomento, di virgole rispetto allo spazio, nella delimitazione dei parametri.cmd- virgola per separare i parametri Rispetto allo spazio?

Sono domande che programmatori C familiarità con il richiamo del cmd, possono essere in grado di far luce su ..

So che quando si fa

c:\>program a b c 

ci sono 4 parametri [0]=program[1]=a[2]=b[3]=c

Secondo hh ntcmds.chm concetti ..

Shell panoramica

; and , are used to separate parameters 

; or , command1 parameter1;parameter2 Use to separate command parameters. 

vedo dir a,b fornisce lo stesso risultato come dir a b

ma

c:\>program a,b,c dà parametri [0] = programma [1] = a, b, c

Quindi alcuni? o tutto? usano i comandi di Windows; e , ? ed è questa interpretazione nel codice di ogni comando, o fatta dalla shell come con lo spazio?

E se è nel codice di ogni comando .. come faccio a sapere che cosa lo fa? Noto che la documentazione di explorer.exe menziona la virgola, ad es. puoi fare explorer /e,.

ma DIR /? non lo menziona, ma può usarlo. E un tipico programma c non richiede affatto un delimitatore. Quindi è il caso che la shell non usi la virgola per delimitare, usa lo spazio. E i comandi di Windows che fanno, fanno in modo che siano (tutti?) Scritti per delimitare i parametri che la shell ha dato loro ulteriormente quando si usano le virgole?

risposta

4

Esistono due differenze qui tra Unix e Windows:

  • comandi interni come DIR sono integrati nel guscio; la loro sintassi della riga di comando non deve seguire le stesse regole dei programmi regolari
  • Su Windows, i programmi sono responsabili dell'analisi delle proprie linee di comando. Il guscio analizza redirect e tubi, poi passa il resto della riga di comando per il programma in una stringa

programmi di Windows C incorporata utilizzando Visual Studio utilizzare il parser riga di comando nella runtime Microsoft C, che è simile a un tipico parser di shell Unix e obbedisce a spazi e virgolette.

Non ho mai visto un programma C che utilizza , o ; come separatore della riga di comando. Ero a conoscenza del caso speciale per , ma non avevo mai visto l'esempio dir a,b fino a poco tempo fa.

+0

Come si può sapere cosa viene fatto dalla shell e cosa viene eseguito dal runtime MS C o dalla lib standard? Ho un prog di windows c con solo #include Nella parte superiore, e il codice per la visualizzazione di argv. compilato con gcc.Non vedo un modo per vedere quale "parametrizzazione!" è fatta dalla shell e che è automatica dalla libreria standard. Inoltre, noto che la virgola non funziona per i programmi esterni xcopy o telnet. Penso di averlo visto per rundll32. Immagino che sia solo un po '. Forse non è una funzione in una libreria disponibile pubblicamente! Forse solo programmi ext eccezionali che fanno l'aping di cmd.exe interni di cmd.exe – barlop

+0

Tutto è fatto dal runtime di MS C tranne la funzionalità di shell. La funzionalità di shell include cose come il reindirizzamento ('<', '>', ecc. '>>'), piping ('|'), controllo di flusso ('&&' e '||') ed escaping ('^'). Come ho detto, non ho mai visto un programma che usa ',' sulla riga di comando, quindi non sono sorpreso che la copia e il telnet non lo supportino. –

+0

stai suggerendo che ms c runtime delimita spazi e virgolette? o è ancora guscio? e se è runtime ms c, puoi provarlo? Non vedo come il tuo secondo punto elenco distingua unix e windows perché cos non unix shell gira anche redirect e pipe. – barlop

0

I file batch utilizzano una virgola o un punto e virgola come separatore di argomenti alternativo.

test file batch:

@echo %1/%2/%3 

Prova di funzionamento:

> test.cmd 1,2,3 
1/2/3 
> test.cmd 1;2 3 
1/2/3 

E, come si nota, dir lo usa, copy così - quelli sono entrambi shell built-in e probabilmente attraversano un parser simile come i file batch (non è esattamente lo stesso, dal momento che puoi fare cose come cd.. o dir/s che non sono possibili per nient'altro). Immagino (nota: speculazione) questa è una sorta di retrocompatibilità che risale ai giorni DOS o anche CP/M. Oggigiorno probabilmente dovresti semplicemente usare gli spazi. E come nota Tim, il runtime C detta alcune cose sugli argomenti e su come dovrebbero essere analizzati. Molti altri linguaggi/framework seguono quella convenzione ma non necessariamente tutti. PowerShell ad esempio ha una gestione degli argomenti completamente diversa e questo a volte può essere una sorpresa quando si interagisce con programmi nativi all'interno di esso (detto, i cmdlet e le funzioni di PowerShell non sono programmi eseguibili altrove, ma file batch allo stesso modo).

+1

hai scritto "I cmdlet di PowerShell e le funzioni non sono programmi eseguibili altrove, ma i file batch allo stesso modo" dovrebbe essere un no, e il ma, rimosso? i file batch come dici tu, allo stesso modo, non possono essere eseguiti da PowerShell, quindi non vedo perché c'è un 'ma' lì. – barlop

Problemi correlati