windows批处理脚本 - 在for循环中设置变量

时间:2013-12-31 08:17:49

标签: windows variables batch-file for-loop

也许我没有清楚地表达我的问题,这是我所做的实际代码:

@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没有按预期正确分配,我的错误是什么以及如何纠正?非常感谢

2 个答案:

答案 0 :(得分:3)

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

请参阅此小演示(我使用简单的if构造而不是for,但效果相同(不是iffor,而是< em> blocks (在()内)。

@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!

答案 1 :(得分:0)

这可能会有所帮助,使用您的代码作为基础。 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文件,因此后续存档将无需存档。