Utilizzo dei parametri nei file batch nella riga di comando di Windows


161

In Windows, come si accede agli argomenti passati quando viene eseguito un file batch?

Ad esempio, supponiamo che io abbia un programma chiamato hello.bat. Quando accedo hello -aalla riga di comando di Windows, come faccio a sapere che il mio programma è -astato passato come argomento?


Come passare i parametri della riga di comando a un file batch: stackoverflow.com/questions/26551/…
Eric Leschinski,

3
Egli menziona "riga di comando DOS".
David R Tribble,

Risposte:


287

Come altri hanno già detto, è possibile accedere ai parametri passati attraverso la riga di comando in file batch con la notazione %1to %9. Esistono anche altri due token che è possibile utilizzare:

  • %0è il nome eseguibile (file batch) come specificato nella riga di comando .
  • %*sono tutti i parametri specificati nella riga di comando - questo è molto utile se si desidera inoltrare i parametri a un altro programma.

Ci sono anche molte tecniche importanti da conoscere oltre a come accedere ai parametri.

Verifica se un parametro è stato passato

Questo viene fatto con costrutti come IF "%~1"=="", il che è vero se e solo se non sono stati passati argomenti. Nota il carattere tilde che provoca la rimozione di eventuali virgolette circostanti dal valore di %1; senza una tilde otterrai risultati imprevisti se quel valore include virgolette doppie, inclusa la possibilità di errori di sintassi.

Gestire più di 9 argomenti (o semplicemente semplificare la vita)

Se è necessario accedere a più di 9 argomenti, è necessario utilizzare il comando SHIFT. Questo comando sposta i valori di tutti gli argomenti di una posizione, in modo che %0prenda il valore di %1, %1prenda il valore di %2, ecc. %9Assume il valore del decimo argomento (se presente), che non era disponibile attraverso nessuna variabile prima di chiamare SHIFT(invio comando SHIFT /?per ulteriori opzioni).

SHIFTè utile anche quando si desidera elaborare facilmente i parametri senza richiedere che siano presentati in un ordine specifico. Ad esempio, uno script può riconoscere le bandiere -ae -bin qualsiasi ordine. Un buon modo per analizzare la riga di comando in questi casi è

:parse
IF "%~1"=="" GOTO endparse
IF "%~1"=="-a" REM do something
IF "%~1"=="-b" REM do something else
SHIFT
GOTO parse
:endparse
REM ready for action!

Questo schema consente di analizzare righe di comando piuttosto complesse senza impazzire.

Sostituzione dei parametri batch

Per i parametri che rappresentano i nomi dei file, la shell offre molte funzionalità relative all'utilizzo di file che non sono accessibili in nessun altro modo. Questa funzionalità è accessibile con costrutti che iniziano con %~.

Ad esempio, per ottenere la dimensione del file passato come argomento utilizzare

ECHO %~z1

Per ottenere il percorso della directory da cui è stato avviato il file batch (molto utile!) È possibile utilizzare

ECHO %~dp0

È possibile visualizzare l'intera gamma di queste funzionalità digitando CALL /?il prompt dei comandi.


4
Il costrutto: parse,: endparse è bellezza, anche con GOTO. Grazie! (Voglio dire, il DOS-BASIC forzato GOTO)
mmrtnt

1
Questa tecnica potrebbe non riuscire quando si chiama la BAT da PowerShell. Un argomento citato come "name=John"diventerà name Johndurante exe. Una soluzione alternativa è racchiudere tra virgolette singole,'"name=John"'
cmcginty

1
Come sono andato così a lungo senza CALL /?!? Qui ho avuto problemi con Google per tutto il tempo.
bigtlb

@Jon Ho scritto il file bat che contiene solo un codice echo% 1 se lo chiamo tramite cmd, ad esempio xx.bat e parametro> "C: \ yy.txt" chiamando il file bat con il parametro e scrivendo nel file txt ma se do & nel parametro all'inizio o alla fine non funziona. Qualsiasi altro testo funziona bene.
Alex Mathew,

56

Utilizzo dei parametri nei file batch:% 0 e% 9

I file batch possono fare riferimento alle parole passate come parametri con i token: %0to %9.

%0 is the program name as it was called.
%1 is the first command line parameter
%2 is the second command line parameter
and so on till %9.

i parametri passati sulla riga di comando devono essere caratteri alfanumerici e delimitati da spazi. Poiché %0è il nome del programma come è stato chiamato, in DOS %0sarà vuoto per AUTOEXEC.BAT se avviato all'avvio.

Esempio:

Inserisci il seguente comando in un file batch chiamato mybatch.bat:

@echo off
@echo hello %1 %2
pause

Invocare il file batch in questo modo: mybatch john billyoutput:

hello john billy

Ottieni più di 9 parametri per un file batch, usa:% *

Il token Percent Star %*significa "il resto dei parametri". Puoi usare un ciclo for per afferrarli, come definito qui:

http://www.robvanderwoude.com/parameters.php

Note sui delimitatori per i parametri batch

Alcuni caratteri nei parametri della riga di comando vengono ignorati dai file batch, a seconda della versione DOS, indipendentemente dal fatto che siano "escape" o meno, e spesso a seconda della loro posizione nella riga di comando:

commas (",") are replaced by spaces, unless they are part of a string in 
double quotes

semicolons (";") are replaced by spaces, unless they are part of a string in 
double quotes

"=" characters are sometimes replaced by spaces, not if they are part of a 
string in double quotes

the first forward slash ("/") is replaced by a space only if it immediately 
follows the command, without a leading space

multiple spaces are replaced by a single space, unless they are part of a 
string in double quotes

tabs are replaced by a single space

leading spaces before the first command line argument are ignored

5

I file batch passano automaticamente il testo dopo il programma, purché siano variabili a cui assegnarli. Sono passati per essere inviati; ad es.% 1 sarà la prima stringa inviata dopo la chiamata al programma, ecc.

Se hai Hello.bat e i contenuti sono:

@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause

e invochi il batch al comando tramite

hello.bat APerson241% data%

dovresti ricevere questo messaggio indietro:

Ciao, APerson241 grazie per aver eseguito questo file batch (01/11/2013)


4

@ Jon :parse/ :endparseschema è un ottimo inizio, e ha la mia gratitudine per il passo iniziale, ma se si pensa che il sistema lotto tortuoso di Windows sarebbe farvi scendere così facile ... beh, il mio amico, siete dentro per una scossa. Ho trascorso l'intera giornata con questa diavoleria e, dopo molte dolorose ricerche e sperimentazioni, ho finalmente gestito qualcosa di fattibile per un'utilità nella vita reale.

Diciamo che vogliamo implementare un'utilità foobar. Richiede un comando iniziale. Ha un parametro opzionale --fooche accetta un valore opzionale (che ovviamente non può essere un altro parametro); se il valore non è presente, viene impostato per impostazione predefinita default. Ha anche un parametro opzionale --barche accetta un valore richiesto . Infine può prendere una bandiera --bazsenza valore consentito. Oh, e questi parametri possono arrivare in qualsiasi ordine.

In altre parole, si presenta così:

foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]

Complicato? No, sembra abbastanza tipico delle utility della vita reale. ( gitqualcuno?)

Senza ulteriori indugi, ecco una soluzione:

@ECHO OFF
SETLOCAL
REM FooBar parameter demo
REM By Garret Wilson

SET CMD=%~1

IF "%CMD%" == "" (
  GOTO usage
)
SET FOO=
SET DEFAULT_FOO=default
SET BAR=
SET BAZ=

SHIFT
:args
SET PARAM=%~1
SET ARG=%~2
IF "%PARAM%" == "--foo" (
  SHIFT
  IF NOT "%ARG%" == "" (
    IF NOT "%ARG:~0,2%" == "--" (
      SET FOO=%ARG%
      SHIFT
    ) ELSE (
      SET FOO=%DEFAULT_FOO%
    )
  ) ELSE (
    SET FOO=%DEFAULT_FOO%
  )
) ELSE IF "%PARAM%" == "--bar" (
  SHIFT
  IF NOT "%ARG%" == "" (
    SET BAR=%ARG%
    SHIFT
  ) ELSE (
    ECHO Missing bar value. 1>&2
    ECHO:
    GOTO usage
  )
) ELSE IF "%PARAM%" == "--baz" (
  SHIFT
  SET BAZ=true
) ELSE IF "%PARAM%" == "" (
  GOTO endargs
) ELSE (
  ECHO Unrecognized option %1. 1>&2
  ECHO:
  GOTO usage
)
GOTO args
:endargs

ECHO Command: %CMD%
IF NOT "%FOO%" == "" (
  ECHO Foo: %FOO%
)
IF NOT "%BAR%" == "" (
  ECHO Bar: %BAR%
)
IF "%BAZ%" == "true" (
  ECHO Baz
)

REM TODO do something with FOO, BAR, and/or BAZ
GOTO :eof

:usage
ECHO FooBar
ECHO Usage: foobar ^<command^> [--foo [^<fooval^>]] [--bar ^<barval^>] [--baz]
EXIT /B 1

Sì, è davvero così male. Vedi il mio post simile su https://stackoverflow.com/a/50653047/421049 , dove fornisco ulteriori analisi di ciò che sta accadendo nella logica e perché ho usato determinati costrutti.

Hideous. Gran parte di ciò che ho dovuto imparare oggi. E faceva male.


3

Usa le variabili, ovvero le .BATvariabili e chiamate %0a%9

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.