首先我要说的是我对此非常陌生,以及我在本网站上发现的拼凑的小代码。
最后我需要一个批处理,当运行时将获取父目录中的每个文件夹名称。并将其复制到名为label1,label2,ect的文本文件中。
我开始从文本文件中的目录列表中提取行。我可以使用此帖子中的Seth代码将最后一行回显到文件 Windows Batch file to echo a specific line number
我做了一些修改,试图把它放在一个循环中,现在我什么也没得到。
如果有人可以帮助我,我将不胜感激。到目前为止,这是我的代码。
set /a "x=1"
set /a "lines=91"
:while1
if %x% leq %lines% (
for /f "tokens=*" %%a in ('findstr /n .* "Y:\Test\foldernametest.txt"') do (
set "FullLine=%%a"
for /f "tokens=1* delims=:" %%b in ("%%a") do (
setlocal enabledelayedexpansion
set "LineData=!FullLine:*:=!"
if "%%b" equ "%1" echo(!LineData!
echo title=!linedata! > Lable%x%.dat
set /a "x= x+1"
endlocal
goto :while1
)
)
答案 0 :(得分:0)
setlocal enabledelayedexpansion
set /a x=1
set /a lines=91
:while1
if %x% leq %lines% (
for /f "tokens=*" %%a in ('findstr /n .* "Y:\Test\foldernametest.txt"') do (
for /f "tokens=1* delims=:" %%b in ("%%a") do (
if "%%b" equ "%x%" (
echo(%%c
echo title=%%c > Lable%x%.dat
set /a x= x+1
goto while1
)
)
)
endlocal
我有理由相信这会起作用,
也是如此setlocal enabledelayedexpansion
set /a x=1
set /a lines=91
:while1
if %x% leq %lines% (
for /f "tokens=1* delims=:" %%a in ('findstr /n .* "Y:\Test\foldernametest.txt"') do if %%a==%x% (
echo(%%b
echo title=%%b > Lable%x%.dat
set /a x= x+1
goto while1
)
)
endlocal
您的代码的问题是endlocal
终止了setlocal
以及自setlocal
退出以来发生的所有环境更改 - 环境恢复到它的状态是setlocal
被执行的时候。
结果是,对于您的代码,您正在递增x
(变量的宏名称),然后在执行endlocal
时撤消增量。
所以 - 将整个例程放在setlocal/endlocal
括号中。这还有其他优点 - 比如在setlocal
之后立即执行@echo off
,然后当例程终止时,环境将返回到其原始状态 - 它不会累积更改(通常添加变量)越来越多的批次运行。
我所做的其他一些改变是化妆品。 set /a
中的引号是多余的,goto
中的冒号也是多余的(只有goto :eof
除外)
你遇到的另一个问题是%1
(意思是“例程的第一个参数”),你可能意味着“%x%”。
在第一个代码片段中,findstr
的输出分配给%%a
,内部for
将分隔符前findstr
的那部分分配给%%b
1}}以及之后%%c
。您显然希望选择等于%%b
的行%x%
,以便代码进行比较,如果相等,则将%%c
(其余行)和title=%%c
输出到文件中来自Lable
和行号。 (你拼写错误label
);然后递增x
并再次尝试。
第二段代码是第一段的简化。从文件中读取该行并编号,然后直接在冒号上拆分; %%a
获取该行的其余部分的数字%%b
,因此,如果%%a
与数字%x%
相同,那么我们想要做一些事情(不需要引号,因为%%a
是一个简单的数字字符串,x
也是数字,因为它从未分配给包含分隔符的字符串或为空)。
要完成的事情是回显文件中的行(在%%b
中,碰撞行号并重新开始......