我需要创建一个 bat 文件,它将根据文件名的一部分创建一个文件夹。
下面应该使用文件内的日期创建 2 个文件夹。
它是 3 个Adobe files
和 1 个.txt
文件:
文件名应为20200205
SP190PED_GRN_SA_960_202002051029
SP190PED_GRN_SA_960_202002051029.txt
SP191PED_RED_PPA_SA_960_202002051029
SP191PED_RED_PPA_SA_960_202002051029
文件名应为20200218
SP190PED_GRN_SA_960_202002181029
SP190PED_GRN_SA_960_202002181029.txt
SP191PED_RED_PPA_SA_960_202002181029
SP191PED_RED_PPA_SA_960_202002181030
这对我根本没有帮助:
@echo off
for %%a in (*806_*) do (
md "%%~na" 2>nul
move "%%a" "%%~na"
)
pause
答案1
@echo off & cd /d "%~dp0"
setlocal enabledelayedexpansion
for /f tokens^=* %%i in ('where .:*^|find/v "%~nx0"')do (
call :trick "%%~ni" && 2>>nul md "!_dir:~0,8!"
move "%%~i" "!_dir:~0,8!" 2>>nul >>nul
)
:trick
set "_dir=%~1" <nul || endlocal && goto :EOF
set "_trick=%_dir:_=" & set "_dir=%" && exit /b
_ 或者其他名称文件夹布局:\2020-02-05 \2020-02-18
@echo off & cd /d "%~dp0"
setlocal enabledelayedexpansion
for /f tokens^=* %%i in ('where ".:*.*" ^| find /v "%~nx0"') do (
call :trick "%%~ni" && 2>nul md "!_dir:~0,4!-!_dir:~4,2!-!_dir:~6,2!"
move "%%~i" "!_dir:~0,4!-!_dir:~4,2!-!_dir:~6,2!" 2>nul >nul
)
:trick
set "_dir=%~1" <nul || endlocal && goto :EOF
set "_trick=%_dir:_=" & set "_dir=%" && exit /b
假设:
bat/cmd 文件将在包含文件的同一文件夹中被保存/执行;
布局中的所有文件名都有下划线分隔符
_
相应的名称始终是最后一个分隔符后的数字
最后一个分隔符中的名称始终以数字开头;
文件夹名称的目标长度为8位数字;
- 使用
for /f
循环命令where
列出路径/文件夹中的所有文件 where
将命令输出重定向到,find /v
以防止你的 bat(%~nx0
) 被列出- 使用
:trick
标签/函数设置变量名称,删除最后一个之前的任何字符串_
- 调用该函数并使用返回的变量来创建所需的文件夹名称
set "_trick=%_dir:_=" & set "_dir=%"
根据分隔符将字符串拆分为子字符串(作者:Sponge Belly/DosTips.com)