Melhor lidar com os nomes de arquivos que mantêm a expansão atrasada desativada . Tratar as variáveis atribuídas dentro de um bloco de códigos (
)
em uma sub-rotina da seguinte forma:
@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
set "sourcedir=D:\bat\Unusual Names"
PUSHD %sourcedir%
dir /b /a-d "*!a*.*"
FOR /f "tokens=* delims=?" %%a in ( 'dir /b /a-d "*!a*.*"') DO (
SET "file=%%~nxa"
rem observe instructions "make a new folder for each file with the same name"
rem suppose that without extension
SET "folder=%%~dpna"
call :DoDelayedExpansion
)
POPD
ENDLOCAL
goto :eof
:DoDelayedExpansion
echo(
echo MD "%folder%\" 2>NUL
echo MOVE "%file%" "%folder%\"
goto :eof
O próximo script dá um exemplo usando apenas o meu conjunto de dados de teste existente. Nota:
- use a sintaxe
set "variable=value"
com aspas duplas para escapar de alguns caracteres de um significado especial em scripts em lote, por exemplo,|
,&
,<
,>
etc. e para garantir que não haja espaços em branco à direita (acidentalmente esquecidos); - os comandos
MD
eMOVE
são meramenteecho
ed para fins de depuração; remova todos osecho
antes de ser depurado.
Saída :
==>D:\bat\SF4616.bat
01exclam!ation.txt
02exc!lam!ation.txt
MD "D:\bat\Unusual Namesexclam!ation\"
MOVE "01exclam!ation.txt" "D:\bat\Unusual Namesexclam!ation\"
MD "D:\bat\Unusual Namesexc!lam!ation\"
MOVE "02exc!lam!ation.txt" "D:\bat\Unusual Namesexc!lam!ation\"
==>
Recursos (leitura obrigatória):
- (referência de comando) Um índice A-Z da linha de comando do Windows CMD
- (particularidades adicionais) Sintaxe da linha de comando do shell do Windows CMD
- (
%~a
etc. página especial) Argumentos da linha de comando (parâmetros) - (página especial) EnableDelayedExpansion