No prompt de comando armazene um “!” de um nome de arquivo em um varible

1

Eu tenho um conjunto de arquivos em uma pasta com nomes como test! - 01.avi . Eu quero fazer uma nova pasta para cada arquivo com o mesmo nome e, em seguida, mova o arquivo para essa pasta. Eu tenho tudo, mas como puxar o "!" e copie o arquivo para a pasta.

@ECHO OFF
setlocal enabledelayedexpansion
set "sourcedir=Z:\test"
set folder=null
set file=null
PUSHD %sourcedir%
FOR /f "tokens=* delims=?" %%a in ( 'dir /b /a-d "*[720p].*"'
 ) DO (
  SET file=%%a
  FOR /f "tokens=1,2,* delims=]-" %%b in ("%%a" "[*] * - * [720p].*"
   ) DO (
   FOR /f "tokens=* delims= " %%e in ("%%c"
    ) DO (
     SET folder=%%e
     FOR /l %%f in (1,1,31) do if "!folder:~-1!"==" " set folder=!folder:~0,-1!
     MD "!folder!"
     MOVE "!file!" .\"!folder!"\ 
     )  
    )   
 )
POPD
GOTO :EOF

Obrigado por dar uma olhada

    
por Pyrotek 27.05.2015 / 02:05

1 resposta

0

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 e MOVE são meramente echo ed para fins de depuração; remova todos os echo 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):

por 10.06.2015 / 23:11