windows - *For 循环* 和 *延迟扩展* 的问题

标签 windows for-loop batch-file cmd delayedvariableexpansion

此批处理是创建一个报告,输出文件夹的最新文件。主要目的是查看目录中生成文件的日期。还可以轻松检查目标目录是否更新。

问题:
更改输出以获取三个最新文件,也被另一个For循环内的For循环困住了,我也在使用延迟扩展。

尝试在FOR循环中使用延迟扩展变量(!forOPT!)

FOR ... (
    FOR /F "!forOPT!" %%a IN ('dir "!path2check!" /A-D /OD /t:w ^| FIND "/"') DO ( )
)

我想在另一个 For 循环 中使用变量“forOPT”来替换“skip=10 tokens=1-5”,但因为 For 循环 不会不像延迟扩展(!forOPT!),我被卡住了。

编辑:

经Mofi的建议和建议,问题现已解决。谢谢莫菲。

至于如何展示的答案,也是 Jeb 做出的。所以也谢谢你,杰布。

我的相关问题的解决方案是使用CALL函数而不是嵌套FOR循环

请参阅我的回答以获取最终代码,并进行一些调整和附加要求来满足我的需求。

@if (@CodeSection == @Batch) @then
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

SET "path2check=NULLLL"
SET "TargetDIR=%~dp0"
SET "curPATH=%~F0"
SET "newSize1=0"
SET JScall=Cscript //nologo //E:JScript !curPATH!
FOR /f "usebackq delims=" %%I IN (destPath.txt) DO (
SET "path2check=%%I"
SET cnt=0
SET totalSkip=1
FOR %%A IN ("!path2check!\*") DO SET /a cnt+=1
SET /a totalSkip=!cnt!-3

SET "forOPT=skip=!totalSkip! tokens=1-5"

ECHO !forOPT! ^<^<^< shows option
ECHO.

ECHO ---------------------

FOR /F "!forOPT!" %%a IN ('dir "!path2check!" /A-D /OD /t:w ^| FIND "/"') DO (
    SET "Date1=%%a"
    SET "Time1=%%b"
    SET "Time2=%%c"
    SET "Size1=%%d"
    SET "Filename1=%%e"
    SET newSize1=!size1:,=!
    IF !newSize1! LEQ 1000 (
      SET "newSize2=!newSize1! Bytes"
    )
    IF !newSize1! GEQ 1000 (
      FOR /F %%a IN ('!JScall! "!newSize1!/1024"') DO SET "newSize2=%%a"
      FOR /F "delims=." %%z IN ("!newSize2!") DO SET "newSize2=%%z KB"
    )
    IF !newSize1! GEQ 1000000 (
      FOR /F %%a IN ('!JScall! "!newSize1!/1024/1024"') DO SET  "newSize2=%%a"
      FOR /F "delims=." %%z IN ("!newSize2!") DO SET "newSize2=%%z MB"
    )
    ECHO !Filename1! - !newSize2! - !Time1!!Time2! - !Date1!
    )
    ECHO - EOR - !path2check!
    ECHO.
)
GOTO :EOF

@end
WScript.ECHO(eval(WScript.Arguments.Unnamed.Item(0)));

报告也应如下所示。 (每个目录最新的三个文件)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Most recently file of path : E:\

Date: dd/mm/yyyy hh:mmPM   |   Size: xxx MB  |   Filename: abc.abc
Date: dd/mm/yyyy hh:mmPM   |   Size: xxx MB  |   Filename: abc.abc
Date: dd/mm/yyyy hh:mmPM   |   Size: xxx MB  |   Filename: abc.abc

                   -   EOR   -

这个批处理文件也是从 StackOverflow(<谢谢)和 SS64(<谢谢)上的许多网站合并和混合在一起的。

即使我解释得不太好,但你可以问,我可以澄清。 :)

如果标题需要编辑,请告诉我,这也可能会帮助其他有类似问题的人。

谢谢Stack Overflow、Mofi 和 Jeb。

最佳答案

在 FOR 选项中,只有百分比扩展有效,因此您需要使用函数。

FOR /f "usebackq delims=" %%I IN (destPath.txt) DO (
  ...
  SET "forOPT=skip=!totalSkip! tokens=1-5"
  call :innerLoop
)

:innerLoop
FOR /F "%forOPT%" %%a IN ('dir "!path2check!" ...) do (
  ....
)
exit /b

关于windows - *For 循环* 和 *延迟扩展* 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33973243/

相关文章:

c++ - Qt如何申请管理员权限?

windows - 在 Windows 中自动执行任务的最佳方式

java图像不显示

parsing - DOS 批处理 : get last folder from relative path

windows - for 循环的批处理脚本不起作用,仅循环一次

php - 在 Wamp 服务器上为 Z​​end 应用程序设置 VirtualHost

c++ - 通过组策略安装 VC++ 可再发行组件的最佳方法是什么?

c# - C#如何在列表的开头和结尾处修剪空元素

ruby - 在 Ruby 中循环的首选方式是什么?

java - 在cmd中执行后退出bat文件