[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 aloha20200628 于 2024-9-6 14:20 编辑

回复 1# onging

新建当天文件夹例如 "2024-09-06" 与当前文件夹平级
以下批处代码存为 test.bat 置于当前文件夹下运行,将当前文件夹下当天创建生成的全部文件(排除本批处脚本文件)和子文件夹移到新建当天文件夹中 ...
  1. @echo off &md "..\%date:~,10%" 2>nul
  2. (for /f "tokens=3* delims= " %%a in ('dir /tc/o-d^|findstr /bc:"%date:~,10% " ') do if "%%b" neq "." if "%%b" neq ".." if /i "%%b" neq "%~nx0" move /y "%%b" "..\%date:~,10%\") 2>nul
  3. pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2024-9-6 14:40 编辑

回复 4# onging

我测试顺利通过的系统:
   系统日期变量 %date% 采用的序列和分隔符如是 2024-09-06,命令行用 echo,%date% 即可查看结果;
   系统码页(命令行用 chcp 查看)是936,不是65001
   与楼主有差别吗?
重新调整了3楼代码获取当天时间值的方法,如果与楼主采用的系统码页没有差别,再试试3楼代码应该可以了...

TOP

本帖最后由 aloha20200628 于 2024-9-6 21:59 编辑

回复 7# ppll2030
回复 4# onging

谢谢!据此再修理一下3楼代码如下。
想起了以前曾和77七讨论过不同系统版本的%date%返回值不一定相同的问题,稳妥之策还是要用 %date:~0,10% 取值...
  1. @echo off &setlocal &set "td=%date:/=-%"
  2. md "..\%td:~0,10%" 2>nul
  3. (for /f "tokens=3* delims= " %%a in ('dir /tc/o-d^|findstr /bc:"%td:~0,10% " ') do if "%%b" neq "." if "%%b" neq ".." if /i "%%b" neq "%~nx0" move /y "%%b" "..\%td:~0,10%\") 2>nul
  4. endlocal&pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2024-9-6 22:09 编辑

回复 9# onging

谢谢10,11楼提醒
若楼主 dir 列表显示的时间格式如11楼所示 2024/09/06 周五 .... 则8楼代码须订正如下,其实就是多了一个 ‘周五’ 的字段

  1. @echo off &setlocal &set "td=%date:/=-%"
  2. md "..\%td:~0,10%" 2>nul
  3. (for /f "tokens=4* delims= " %%a in ('dir /tc/o-d^|findstr /bc:"%date:~0,10% " ') do if "%%b" neq "." if "%%b" neq ".." if /i "%%b" neq "%~nx0" move /y "%%b" "..\%td:~0,10%\") 2>nul
  4. endlocal&pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2024-9-7 19:38 编辑


为批处应对此类题型留下前车之鉴》
   取值 %date% 须截取 %date:~0,10%,
   用其创建目录前须置换其中分隔符 %date:/=-%,
   提取 dir 全量列表后几项数据前须检测其中时间字段的个数...
以下代码是对3,8,14楼代码的完整修复... 运行结果会将 ‘d:\目标文件夹’ 中当日创建生成的目录和文件移至 ‘d:\目的地文件夹\20240907’ 目录中...
  1. @echo off &setlocal &set "td=%date:/=-%"
  2. cd /d "d:\目标文件夹" &set "td=d:\目的地文件夹\%td:~0,10%"
  3. md "%td%" 2>nul &set "tf=%td%\all.tmp"
  4. dir /tc/o-d|findstr /bc:"%date:~0,10% ">"%tf%" &set/p s=<"%tf%"
  5. if "%s:~14,1%"==":" (set "q=3") else (set "q=4")
  6. (for /f "tokens=%q%* delims= " %%a in (%tf%) do if "%%b" neq "." if "%%b" neq ".." if /i "%%b" neq "%~nx0" move /y "%%b" "%td%\")>nul 2>nul
  7. del /q "%tf%"&endlocal&pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2024-9-7 16:41 编辑

回复 18# onging

是要指定一个已有的 ‘目的地’ 文件夹?还是要新建一个自定义名称的 ‘目的地’ 文件夹? 总之,建议这个 ‘目的地’  文件夹尽可能与当前文件夹分开...
15楼代码已更新,关闭了 move 过程的回显...

TOP

本帖最后由 aloha20200628 于 2024-9-7 18:57 编辑

回复 20# onging

在已被订正的15楼代码第二行》
   d:\目标文件夹  可改为你要移动当日数据的文件夹名(须是全路径,例如 d:\abc\1)
   d:\目的地文件夹  可改为被移动数据的目的地文件夹名(须是全路径,例如 d:\xyz\1),在此文件夹下将生成名如 ‘2024-09-07’ 的当日文件夹

TOP

回复 22# onging

代码最后一行改为》 del /q "%tf%"&endlocal&exit/b  即可

TOP

回复 24# onging

老美用的英文版有可能采用 08/31/2024 这类时间格式,可先用小样本数据试一下代码看看结果...

TOP

本帖最后由 aloha20200628 于 2024-9-11 11:15 编辑


     进一步验证》系统日期的格式设置确实有很多种,其设置结果基本与资源管理器的日期显示格式一致,但与%date%, %%~tF和dir列表的日期取值格式不一定相同,无论系统日期格式如何调整,后三者除了分隔符与其保持一致之外,日期值净长度总是在8位(如24-01-31)或10位(如2024-01-31)取值,而资源管理器的日期显示格式可在6-10位之间变化,因此%date%的更稳妥取值方法是用 for /f "tokens=1 delims= " %%a in ("%date%") do set "td=%%a"
     以下代码是将15楼代码重写成不调用findstr筛选当日数据的版本,直接用dir/b/tw/o-d排序,令当日数据置顶,从而能对其首先处理并及时结束退出,也免去了采用findstr须检测时间字段个数等关联处理问题...
  1. @echo off &setlocal
  2. for /f "tokens=1 delims= " %%a in ("%date%") do set "td=%%a"
  3. if "%td:~8,1%"=="" (set "e=tt:~0,8") else set "e=tt:~0,10"
  4. cd /d "d:\目标文件夹" &set "dt=d:\目的地文件夹\%td:/=-%"
  5. md "%dt%" 2>nul
  6. for /f "delims=" %%F in ('dir /b/tw/o-d') do if "%%~fF" neq "%~f0" (
  7. setlocal enabledelayedexpansion &set "tt=%%~tF" &set "tt=!%e%!"
  8. if "%td%"=="!tt!" (endlocal & move /y "%%F" "%dt%\") else endlocal&pause&exit/b
  9. )
  10. endlocal&pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2024-9-10 18:39 编辑


29楼代码第三行是为兼容系统日期变量 %date% 和 %%~tF 被取值 yyyy*mm*dd 或 yy*mm*dd 两种实况,以便后续的字符串截取偏移量能自适应10位或8位日期值,其实29楼代码还可更简化一步,用 for/f 分割器一气呵成(确保%date%与%%~tF的日期取值方法相同),同时也省略了循环体内的延迟变量... 代码如下
  1. @echo off &setlocal
  2. for /f "tokens=1 delims= " %%a in ("%date%") do set "td=%%a"
  3. cd /d "d:\目标文件夹" &set "dt=d:\目的地文件夹\%td:/=-%"
  4. md "%dt%" 2>nul
  5. for /f "delims=" %%F in ('dir /b/tw/o-d') do if "%%~fF" neq "%~f0" (
  6.     for /f "tokens=1 delims= " %%t in ("%%~tF") do if "%td%"=="%%t" (
  7.         move /y "%%F" "%dt%\") else pause&exit/b
  8. )
  9. pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2024-9-11 12:55 编辑

回复 32# qixiaobin0715

一枚手误  阁下真是细心
29楼代码已订正

TOP

返回列表