我在一个文件夹中有一组文件,其名称类似于test! - 01.avi
。我想为每个同名文件创建一个新文件夹,然后将文件移动到该文件夹中。我已经知道了一切,但不知道如何拉入“!”并将文件复制到文件夹中。
@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
谢谢参观
答案1
更好地应对文件名保持延迟扩展已禁用.按如下方式处理子程序中 (
代码块内分配的变量:)
@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
下一个脚本仅使用我现有的测试数据集给出了一个示例。注意:
- 使用带
set "variable=value"
双引号的语法来转义批处理脚本中具有特殊含义的某些字符,例如|
,,等,并确保没有(意外忘记的)尾随空格;&
<
>
MD
和命令都MOVE
仅echo
用于调试目的;echo
调试完成后请立即删除所有命令。
输出:
==>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
等专题页面)命令行参数(参数) - (特殊页面)启用延迟扩展