Como obter o nome do arquivo apenas sem caminho na linha de comando do Windows?

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

Fornece o nome do arquivo de saída junto com o caminho inteiro

\path\to\dir\<filename>

Como obtenho apenas <filename>o caminho sem o incluído? Eu preciso usar essa string 'filename'.

Além disso, é possível fazer o seguinte, depois que o nome do arquivo for adquirido?

for /r %%f in (*) do (
echo "blah blah blah 'filename'" >> blahblah_filename.txt
)
Jay
fonte
3
Para referência futura, a Microsoft possui um Windows XP online - referência de linha de comando AZ, que ainda é aplicável principalmente a versões posteriores. A documentação na resposta que você aceitou está no final da seção no forcomando.
martineau
@martineau: Infelizmente, a página on-line 'Windows XP - Referência da linha de comando AZ' não está mais on-line (removida pela microsoft) e uma alternativa para esta documentação ainda não está disponível (tanto quanto eu possa encontrar alguma documentação em ' % ~ 'documentação do argumento)
PapaAtHome
@PapaAtHome: Felizmente ainda é possível visualizar a referência da linha de comando na máquina de wayback do web.archive.org .
martineau

Respostas:

54

Use %~nxfpara <filename>.<extension>.

E sim, você pode fazer:

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

Veja 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.
Prumo
fonte
Ótima resposta. Alguma idéia de como eu poderia procurar uma substring em um caminho completo? Por exemplo, quero saber se c: \ code \ myapp \ .git \ somefolder inclui o texto ".git".
Dale Barnard #
1
Você pode executar uma pesquisa textual ou regex canalizando o caminho para o comando findou findstr, por exemplo, echo %%f | find "\.git\" > NULou echo %%f | findstr /R /C:"\\\.git\\" /C:"\\\.git\>" > NULe, em seguida, verificando o nível de erro com o ifcomando (o findex regex é muito limitado, então essa é minha tentativa de impor um líder \e [um final \ou final de string]). Observe que if errorlevelhá peculiaridades com o fall-through, e você provavelmente não pode fazer if %errorlevel%um loop; portanto, primeiro é necessário SetLocal EnableDelayedExpansionprimeiro if !errorlevel!.
Bob
@DaleBarnard Além disso, considere usar o PowerShell - muito menos dor e resultados provavelmente mais consistentes.
Bob
O blá blá está me confundindo, o que deve representar? Como o caminho completo do arquivo e o nome do arquivo extraído se encaixam nessa resposta?
precisa saber é o seguinte
@thebunnyrules %~nxfé o nome do arquivo, como eu disse na primeira frase. Ao usá-lo em um arquivo em lotes, é necessário dobrar o número %, tornando-o %%~nxf. Isso blah blah blahé apenas pegar o exemplo na pergunta e substituir o filenamebit pela %%~nxfsubstituição - os blahs são apenas preenchedores e não têm significado específico.
Bob
0

Ainda não sou capaz de comentar, mas acredito que o seguinte deve ser observado para evitar confusão.

Embora fpossa ser usado como um nome de variável FOR, é melhor usar outra letra para evitar confundi-la com uma letra de formato f(que, como indicado na resposta de Bob, retorna o nome completo do caminho) ou, pelo menos, use uma capital F.

SER HÍBRIDO
fonte