Come ottenere il nome file solo senza percorso nella riga di comando di Windows?


31
for /r %f in (*) do echo %f

Fornisce il nome file di output insieme all'intero percorso

\path\to\dir\<filename>

Come posso ottenere solo <filename>senza il percorso incluso? Devo usare quella stringa 'nome file'.

Inoltre, è possibile effettuare le seguenti operazioni, una volta acquisito il nome file?

for /r %%f in (*) do (
echo "blah blah blah 'filename'" >> blahblah_filename.txt
)

3
Per riferimento futuro, Microsoft ha un Windows XP in linea - AZ della riga di comando che è ancora applicabile principalmente alle versioni successive. La documentazione nella risposta accettata si trova alla fine della sezione del forcomando.
martineau,

@martineau: Sfortunatamente, la pagina online "Windows XP - Riferimento alla riga di comando dalla A alla Z" non è più online (rimossa da Microsoft) e non è ancora disponibile un'alternativa per questa documentazione (per quanto posso trovare alcuna documentazione su " % ~ 'documentazione argomento)
PapaAtHome

@PapaAtHome: Fortunatamente è ancora possibile visualizzare il riferimento della riga di comando tramite la macchina di ritorno di web.archive.org .
martineau,

Risposte:


54

Utilizzare %~nxfper <filename>.<extension>.

E sì, puoi fare:

for /r %%f in (*) do (
echo "blah blah blah '%%~nxf'" >> blahblah_%%~nxf.txt
)

Vedi for /?:

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

    %~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

The modifiers can be combined to get compound results:

    %~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
    %~dp$PATH:I - searches the directories listed in the PATH
                   environment variable for %I and expands to the
                   drive letter and path of the first one found.
    %~ftzaI     - expands %I to a DIR like output line

In the above examples %I and PATH can be replaced by other valid
values.  The %~ syntax is terminated by a valid FOR variable name.
Picking upper case variable names like %I makes it more readable and
avoids confusion with the modifiers, which are not case sensitive.

Bella risposta. Hai idea di come potrei cercare una sottostringa in un percorso completo? Ad esempio, voglio sapere se c: \ code \ myapp \ .git \ somefolder include il testo ".git".
Dale Barnard,

1
È possibile eseguire una ricerca testuale o regex eseguendo il piping del percorso nel comando findo findstr, ad esempio echo %%f | find "\.git\" > NULo, echo %%f | findstr /R /C:"\\\.git\\" /C:"\\\.git\>" > NULquindi controllando il livello di errore con il ifcomando. (findstr regex è molto limitato, quindi questo è il mio tentativo di imporre un comando iniziale \e [o finale \o finale della stringa]). Nota che if errorlevelha stranezze con fall-through e probabilmente non puoi if %errorlevel%all'interno di un ciclo, quindi potresti dover SetLocal EnableDelayedExpansionprima fare e poi if !errorlevel!invece.
Bob,

@DaleBarnard Inoltre, considera l'utilizzo di PowerShell - molto meno dolore e probabilmente risultati più coerenti.
Bob,

Il blah blah mi sta confondendo, cosa dovrebbe rappresentare? In che modo il percorso completo del file e il nome del file estratto si adattano a questa risposta?
thebunnyrules,

@thebunnyrules %~nxfè il nome del file, come ho detto nella prima frase. Quando lo si utilizza all'interno di un file batch, è necessario raddoppiare il %, rendendolo %%~nxf. Sta blah blah blahsolo prendendo l'esempio nella domanda e sostituendo il filenamebit con la %%~nxfsostituzione: gli blahs sono solo filler e non hanno alcun significato particolare.
Bob,

0

Non sono ancora in grado di commentare, ma credo che quanto segue dovrebbe essere notato per evitare confusione.

Sebbene fpossa essere usato come un nome di variabile FOR, è meglio usare un'altra lettera per evitare di confonderla con la lettera di formato f(che, come indicato nella risposta di Bob, restituisce il nome completo del percorso), o almeno usare un capitale F.

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.