windows批处理脚本 – 在循环内设置variables

也许我不能清楚地表示我的问题,下面是我所做的实际代码:

@echo off set /p keywords="Enter keywords to search: " %=% dir /b *.dat > filelist.txt for /f "delims=." %%f in (filelist.txt) do ( for /f "delims= " %%g in (%%f.dat) do ( 7z e %%g *sec.evtx dir /b *.evtx > evtfile.txt set /p tmpvar1=<evtfile.txt del *.evtx ) ) 

Filelist.txt中

 tsnint1.dat webint1.dat 

tsnint1.dat

 TSNINT1-201312091700.zip TSNINT1-201312091600.zip TSNINT1-201312091500.zip TSNINT1-201312091400.zip TSNINT1-201312091300.zip TSNINT1-201312091200.zip 

webint1.dat

 WEBINT1-201312091300.zip WEBINT1-201312091200.zip 

我面临的问题是,evtfile包含正确的内容,但tmpvar1没有按预期正确分配,我的错误是什么,以及如何纠正? 非常感谢

Solutions Collecting From Web of "windows批处理脚本 – 在循环内设置variables"

当在同一块内设置(或更改)此变量时,需要延迟扩展来使用块内的变量。 但是你可以设置一个变量而不会延迟扩展。

看到这个小演示(我用一个简单的if结构而不是for ,但效果是一样的(不是iffor ,而是用blocks (inside ( and ) )。

 @echo off REM SETTING a variable inside a block set "var=ONE" echo start: %var% if 1==1 ( echo inside block: %var% set var=TWO echo var has a new value: set var echo inside block is still old: %var% ) echo after block: %var% echo ---------- REM USING a variable inside a block setlocal enabledelayedexpansion set "var=ONE" echo start: %var% if 1==1 ( echo inside block: %var% set var=TWO echo var has a new value: set var echo new value inside block: !var! echo just to demonstrate: %var% ) echo after block: %var% endlocal echo ---------- echo working fine: %var% echo not available after endlocal: !var! 

这可能会帮助你,把你的代码作为基础。 FWIW我希望你有不止一个.evtx文件的副本,如果它们对你很重要的话。

 @echo off setocal enabledelayedexapnsion for /f "delims=" %%f in ('dir /b *.dat') do ( for /f "delims=" %%g in ('type "%%f" ') do ( 7z e "%%g" "*sec.evtx" dir /b *.evtx > evtfile.txt set /p tmpvar1=<evtfile.txt echo !tempvar! del *.evtx ) ) 

一个问题是* .evtx文件在创建第一个文件之后被删除,所以后面的文件将没有任何文件存档。