从命令提示符存储variables中的文件名“!”

我有一个文件夹中的一组文件名称test! - 01.avi test! - 01.avi 。 我想为每个具有相同名称的文件创build一个新文件夹,然后将该文件移动到该文件夹​​中。 我拥有一切,但如何拉入“!” 并将该文件复制到该文件夹​​。

 @ECHO OFF setlocal enabledelayedexpansion set "sourcedir=Z:\test" set folder=null set file=null PUSHD %sourcedir% FOR /f "tokens=* delims=?" %%a in ( 'dir /b /ad "*[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 

谢谢参观

更好地处理文件名保持延迟扩展禁用 。 在子程序中处理(代码块)内分配的variables,如下所示:

 @ECHO OFF SETLOCAL EnableExtensions DisableDelayedExpansion set "sourcedir=D:\bat\Unusual Names" PUSHD %sourcedir% dir /b /ad "*!a*.*" FOR /f "tokens=* delims=?" %%a in ( 'dir /b /ad "*!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 

下一个脚本给出了一个例子,只使用我现有的testing数据集。 注意:

  • 使用set "variable=value"语法用双引号转义批处理脚本中某些特殊含义的字符,例如|&<>等,并确保没有(意外遗忘)尾随空白;
  • 出于debugging的目的, MDMOVE命令都只是echo ; 删除所有的echo不要比debugging。

输出

 ==>D:\bat\SF\694616.bat 01exclam!ation.txt 02exc!lam!ation.txt MD "D:\bat\Unusual Names\01exclam!ation\" MOVE "01exclam!ation.txt" "D:\bat\Unusual Names\01exclam!ation\" MD "D:\bat\Unusual Names\02exc!lam!ation\" MOVE "02exc!lam!ation.txt" "D:\bat\Unusual Names\02exc!lam!ation\" ==> 

资源 (必读):

  • (命令参考) Windows CMD命令行的AZ索引
  • (附加特性) Windows CMD Shell命令行语法
  • %~a等特殊页面) 命令行参数(参数)
  • (特殊页面) EnableDelayedExpansion