我想在批处理脚本的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%应该有增量值。
答案 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.txt
和file2.txt
)中移动了file1
和file2
的路径,以便于访问修改
@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
)