关于批处理的问题,谢谢

kingssman 2007-02-28 11:31:32
写了一个批处理删除当前日期之前的文件
for %%i in (C:\ghost\*.csv) do (
set filetime_a=%%~ti
if not "%filetime_a:~2,2%%filetime_a:~4,3%%filetime_a:~7,3%"=="%date:~-8%" del /f %%i
)

但是运行的时候发现一个问题
C:\ghost>tt.bat
C:\ghost>for %i in (C:\ghost\*.csv) do (
set filetime_a=%~ti
if not "07/02/28" == "07/02/28" del /f %i
)
C:\ghost>(
set filetime_a=2007/02/07 17:31
if not "07/02/28" == "07/02/28" del /f C:\ghost\TEMPSHOHIN.csv
)
C:\ghost>(
set filetime_a=2007/02/27 15:06
if not "07/02/28" == "07/02/28" del /f C:\ghost\b.csv
)
C:\ghost>(
set filetime_a=2007/02/28 10:43
if not "07/02/28" == "07/02/28" del /f C:\ghost\a.csv
)

"%filetime_a:~2,2%%filetime_a:~4,3%%filetime_a:~7,3%"总是取到最晚生成的一个文件的日期,不知道是为什么啊?
为了把运行结果显示的清楚一些,我把
"%filetime_a:~2,2%%filetime_a:~4,3%%filetime_a:~7,3%"
改成了"%filetime_a%"再运行

C:\ghost>tt.bat
C:\ghost>for %i in (C:\ghost\*.csv) do (
set filetime_a=%~ti
if not "2007/02/28 10:43" == "07/02/28" del /f %i
)
C:\ghost>(
set filetime_a=2007/02/07 17:31
if not "2007/02/28 10:43" == "07/02/28" del /f C:\ghost\TEMPSHOHIN.csv
)
C:\ghost>(
set filetime_a=2007/02/27 15:06
if not "2007/02/28 10:43" == "07/02/28" del /f C:\ghost\b.csv
)
C:\ghost>(
set filetime_a=2007/02/28 10:43
if not "2007/02/28 10:43" == "07/02/28" del /f C:\ghost\a.csv
)
这样可以明显看到"%filetime_a%"的值

请高人给解释一下,谢谢了
...全文
281 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
spark_li 2008-03-10
  • 打赏
  • 举报
回复
楼上已经说得很清楚了,我来接分
scz123 2007-03-15
  • 打赏
  • 举报
回复
一个文件内也可以:

for %%i in (C:\ghost\*.csv) do call :clean %%i
goto end
:clean
set filetime_a=%~t1
if not "%filetime_a:~2,2%%filetime_a:~4,3%%filetime_a:~7,3%"=="%date:~-8%" del /f %1
end
ljc007 2007-03-12
  • 打赏
  • 举报
回复
在C盘根目录下新建两个批处理del_call.bat和del_do.bat
需要执行的时候双击del_call.bat即可

del_call.bat内容如下:
@echo off
cmd /v /c C:\del_do.bat

del_do.bat内容如下:
@echo off
for %%i in (C:\ghost\*.csv) do (
set t=%%~ti
set filetime_a=!t:~2,2!!t:~4,3!!t:~7,3!
if not !filetime_a!==%date:~-8% del /f "%%i"
)
scz123 2007-03-01
  • 打赏
  • 举报
回复
延迟环境变量扩充问题
请参考 set /?

<节选自set /?>
延迟环境变量扩充的支持。该支持总是按默认值被
停用,但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。
请参阅 CMD /?

考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境
变量扩充是很有用的,而不是执行的时候。以下例子说明直接
变量扩充的问题:

set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)

不会显示消息,因为在读到第一个 IF 语句时,BOTH IF 语句中
的 %VAR% 会被代替;原因是: 它包含 IF 的文体,IF 是一个
复合语句。所以,复合语句中的 IF 实际上是在比较 "before" 和
"after",这两者永远不会相等。同样,以下这个例子也不会达到
预期效果:

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%

原因是,它不会在目前的目录中建立一个文件列表,而只是将
LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在
FOR 语句被读取时,只被扩充了一次;而且,那时的 LIST 变量
是空的。因此,我们真正执行的 FOR 循环是:

for %i in (*) do set LIST= %i

这个循环继续将 LIST 设成找到的最后一个文件。

延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行
时间扩充环境变量。如果延迟的变量扩充被启用,可以将上面
例子写成以下所示,以达到预期效果:

set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%

如果命令扩展名被启用,有几个动态环境变量可以被扩展,但
不会出现在 SET 显示的变量列表中。每次变量数值被扩展时,
这些变量数值都会被动态计算。如果用户用这些名称中任何
一个定义变量,那个定义会替代下面描述的动态定义:

%CD% - 扩展到当前目录字符串。

%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。

%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。

%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。

%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。

%CMDEXTVERSION% - 扩展到当前命令处理器扩展名版本号。

%CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。
kingssman 2007-03-01
  • 打赏
  • 举报
回复
自己顶一下,没有人知道吗?

6,849

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧