批处理文件 - 循环递增计数值未正确显示

时间:2014-07-24 14:25:20

标签: loops batch-file syntax increment

我试图读取文件并将数据行输出到注册表项中。数据收集工作正常,但我不理解在最后一个循环中增加字符串值所需的语法。

@echo OFF


SETLOCAL DisableDelayedExpansion
FOR /F "usebackq skip=1 delims=" %%a in (`"findstr /n ^^ C:\GetSID.txt"`) do (
set "var=%%a"
SETLOCAL EnableDelayedExpansion
set "var=!var:*:=!" This removes the prefix
echo(!var:~76,63!>>C:\SIDoutput.txt
goto :EndLoop
)
:EndLoop
set /p SID= <C:\users\paintic\SIDoutput.txt

set KEY_NAME="HKEY_USERS\!SID!\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts"

set Counter=1
for /f %%x in (C:\users\paintic\Networkprinters.txt) do (
  set "Line_!Counter!=%%x"
  set /a Counter+=1
  if !Counter!==3 (Echo %line_counter%)
)

set /a counter2=!counter!-3

set counter=1

以下部分是我无法开展的工作。我尝试从前一个循环中写入LINE_1,LINE_2和LINE_3值,以通过下面的循环递增。所以VALUENAME应该等于LINE_1,TYPE应该= LINE_2的值,DATA应该在第一次运行时= LINE_3并继续上升1直到循环结束(文件读取结束)

`for /L %%i in (1,1,%counter2%) do (

   set ValueName=%Line_!counter!%
   set /a counter+=1
   set Type=%Line_!counter!%
   set /a Counter+=1
   set Data=%Line_!counter!%
   set /a Counter+=1
   echo !ValueName!
   echo !Type!
   echo !Data!  

REG ADD %KEY_NAME% /v !ValueName! /t !Type! /d !Data! /f

)

ENDLOCAL 

Pause`

1 个答案:

答案 0 :(得分:0)

在批处理文件中搜索错误时,在第一行@echo on中使用或删除@echo off或使用rem对此行进行评论总是有用的,以便真正了解cmd.exe执行。

命令行解释器在set VariableName=%Line_!counter!%的行上失败,因为解释器不知道首先要扩展什么。我认为不可能动态创建环境变量的名称,然后引用此环境变量的值。这种方法很可能永远不会奏效。

但是,您想要实现的目标可以直接在第二个循环中完成,如下例所示:

@echo off
setlocal EnableDelayedExpansion

rem Create data for demo example.
set "KEY_NAME=HKEY_USERS\S-1-5-20\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts"
echo TestValue>"%TEMP%\Networkprinters.txt"
echo REG_SZ>>"%TEMP%\Networkprinters.txt"
echo Sample Data>>"%TEMP%\Networkprinters.txt"
echo AnotherValue>>"%TEMP%\Networkprinters.txt"
echo REG_DWORD>>"%TEMP%\Networkprinters.txt"
echo ^1>>"%TEMP%\Networkprinters.txt"

rem Now the loop follows which reads the data from the file line
rem by line and build the line for using command "reg.exe" to
rem add the data to registry of the user with the defined SID.
set Counter=1
for /f "usebackq delims=" %%x in ("%TEMP%\Networkprinters.txt") do (
   if "!Counter!"=="1" (
      set "ValueName=%%x"
   ) else if "!Counter!"=="2" (
      set "ValueType=%%x"
   ) else (
      set "ValueData=%%x"
      rem Echo the command instead of really executing "reg.exe".
      echo reg.exe ADD %KEY_NAME% /v "!ValueName!" /t !ValueType! /d "!ValueData!" /f
      set Counter=0
   )
   set /a Counter+=1
)

rem Delete the text file created for demo example.
del "%TEMP%\Networkprinters.txt"
endlocal

此解决方案比您尝试过的解决方案容易得多,甚至可能更加简化。