如何在批处理脚本

时间:2017-02-02 07:45:38

标签: batch-file cmd

我想在批处理脚本的FOR循环中使用SKIP的递增值,下面是我尝试的代码片段,但这不起作用。如果有人对此有任何疑问,请帮忙。这是与2个文件之间的比较有关的要求,逻辑上我必须比较file1.txt中是否包含file2.txt。 file1.txt可能有3行,file2.txt mayu有30行。我使用过以下代码片段代码:

@echo off
setlocal enableextensions enabledelayedexpansion

set /A result_count=1

echo !result_count!
echo %result_count%
set "result="

for /F "usebackq delims=" %%x in (file2.txt) do (

  for /F "skip=%result_count% delims=" %%r in (file1.txt) do (
    if not defined result set "result=%%r"
  )

  if "!result!" == "%%x" (
        echo Passed
  ) else (
        echo Failed
  )

  set /A result_count+=1

)

输出: 1.!result_count!增加值。 2.%result_count%没有递增值。 3.无法使用!result_count! as skip =!result_count!在for循环中。

期望 1.我可以使用!result_count! as skip =!result_count!在for循环中。 2.或者%result_count%应该有增量值。

2 个答案:

答案 0 :(得分:2)

问题是您无法在for /f - 选项中使用延迟扩展。您只能使用常规变量展开%var%。 在您的情况下,最简单的解决方案是在函数中移动内部for /f。在函数内部,您不必担心延迟扩展,并且可以使用%result_count%

您的代码中仍存在一些逻辑错误:

  • 您不会在外部循环中的每次迭代结束时取消设置result变量。这将导致变量仅设置一次(在第一次),因为在此之后if not defined result永远不会被占用(result包含其第一个值)。
  • 选项skip=n将让循环跳过前n行。当您从result_count=1开始时,您永远不会处理file1.txt中的第一行。在描述中,您说您要比较所有行。然后,您应该从result_count=0开始。很遗憾"skip doesn't like 0"(链接是关于skip=0问题及其解决方案的问题。)

更改后,我已在变量(分别为file1.txtfile2.txt)中移动了file1file2的路径,以便于访问修改

@echo off
setlocal enableextensions enabledelayedexpansion

set /A result_count=0

echo %result_count%
set result=
set file1=file1.txt
set file2=file2.txt

for /F "usebackq delims=" %%x in ("%file2%") do (
  call :innerLoop
  if "!result!" == "%%x" (
        echo Passed
  ) else (
        echo Failed
  )
  set result=
  set /A result_count+=1
)

exit /b 0

:innerLoop
IF %result_count% LEQ 0 (
    set skip=
) ELSE (
    set skip=skip=%result_count%
)
for /F "usebackq %skip%delims=" %%r in ("%file1%") do if not defined result set "result=%%~r"
exit /b 0

答案 1 :(得分:0)

另一个选项可能是将 for /f 循环选项保存在变量中:

@echo off
setlocal enableextensions enabledelayedexpansion

set /A result_count=0

echo !result_count!
echo %result_count%
set "result="

for /F "usebackq delims=" %%x in ("file2.txt") do (

  :skipline
  if !result_count! gtr 0 (
    echo Count is greater than zero.
    set "opts=skip=!count! delims="
  ) else (
    echo Count is equal zero.
    set "opts=delims="
  )

  for /F "%opts%" %%r in (file1.txt) do (
    if not defined result set "result=%%r"
  )

  if "!result!" == "%%x" (
        echo Passed
  ) else (
        echo Failed
  )
  set result=
  set /A result_count+=1

)