Domanda

Voglio ottenere il nome del file batch attualmente in esecuzione senza l'estensione del file.

Grazie a questo link , Ho il nome del file con l'estensione ... ma qual è il modo migliore per eseguire una sottostringa in un file batch?

O c'è un altro modo per ottenere il nome del file senza l'estensione?

In questo scenario è sicuro assumere estensioni di 3 lettere.

È stato utile?

Soluzione

Bene, per ottenere semplicemente il nome del file del tuo batch il modo più semplice sarebbe semplicemente usare % ~ n0 .

@echo %~n0

genererà il nome (senza estensione) del file batch attualmente in esecuzione (a meno che non venga eseguito in una subroutine chiamata da call ). L'elenco completo di tali sostituzioni "speciali" per i nomi dei percorsi è disponibile con aiuto per , alla fine dell'aiuto:

  

Inoltre, la sostituzione di FOR   i riferimenti alle variabili sono stati migliorati.   Ora puoi usare il seguente optional   sintassi:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string
     

I modificatori possono essere combinati per ottenere   risultati composti:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only

Per rispondere con precisione alla tua domanda, tuttavia: le sottostringhe vengono eseguite utilizzando la notazione : ~ start, length :

%var:~10,5%

estrae 5 caratteri dalla posizione 10 nella variabile di ambiente % var% .

NOTA: l'indice delle stringhe è basato su zero, quindi il primo carattere è nella posizione 0, il secondo in 1, ecc.

Per ottenere sottostringhe di variabili argomento come % 0 , % 1 , ecc. devi assegnarle a una normale variabile d'ambiente usando set primo:

:: Does not work:
@echo %1:~10,5

:: Assign argument to local variable first:
set var=%1
@echo %var:~10,5%

La sintassi è ancora più potente:

  • % var: ~ -7% estrae gli ultimi 7 caratteri da % var%
  • % var: ~ 0, -4% estrarrebbe tutti i caratteri tranne gli ultimi quattro che eliminerebbero anche l'estensione del file (assumendo tre caratteri dopo il punto [. ]).

Vedi help set per dettagli su quella sintassi.

Altri suggerimenti

Ben spiegato sopra!

Per tutti coloro che potrebbero soffrire come me di farlo funzionare in Windows localizzato (il mio è XP in slovacco), potresti provare a sostituire il % con un !

Quindi:

SET TEXT=Hello World
SET SUBSTRING=!TEXT:~3,5!
ECHO !SUBSTRING!

Come informazioni aggiuntive alla risposta di Joey, che non è descritta nella guida di set /? per /? .

% ~ 0 si espande nel nome del proprio batch, esattamente come è stato digitato.
Pertanto, se avvii il batch, questo verrà espanso come

%~0   - mYbAtCh
%~n0  - mybatch
%~nx0 - mybatch.bat

Ma c'è un'eccezione, l'espansione in una subroutine potrebbe non riuscire

echo main- %~0
call :myFunction
exit /b

:myFunction
echo func - %~0
echo func - %~n0
exit /b

Questo risulta in

main - myBatch
Func - :myFunction
func - mybatch

In una funzione % ~ 0 si espande sempre al nome della funzione, non del file batch.
Ma se usi almeno un modificatore mostrerà di nuovo il nome del file!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top