Lee*_*Lee 6 windows batch-file
因此,对于我当前困境的第二部分,我有一个文件夹列表c:\file_list.txt.我需要能够根据行号提取它们(好吧,用一些mod回显它们),因为这个批处理脚本是由迭代宏进程调用的.我将行号作为参数传递.
@echo off
setlocal enabledelayedexpansion
set /a counter=0
set /a %%a = ""
for /f "usebackq delims=" %%a in (c:\file_list.txt) do (
if "!counter!"=="%1" goto :printme & set /a counter+=1
)
:printme
echo %%a
Run Code Online (Sandbox Code Playgroud)
这给了我一个输出%a.卫生署!所以,我试过回声!a!(结果 :) ECHO is off.; 我试过回声%a(结果:a)
我认为很容易做的就是修改head.bat这里找到的代码:
Windows批处理命令从文本文件读取第一行,
而不是回显每一行 - 我只是回显最后一行找到的.并不像人们想象的那么简单.我注意到我的柜台由于某种原因停留在零; 我想知道这是否set /a counter+=1正在做我认为它正在做的事情.
Set*_*ley 12
我知道这是一个老问题,但对于有类似问题的任何人来说,这里有一些额外的信息......
Lee,你为什么"%% a"在for循环之外没有工作的原因是正确的.%az和%AZ变量(批处理文件中的%% az)是for循环的构造,并且不存在于其外部.
我想推荐一个替代解决方案,以匹配正确的行号(没有空行跳过),并且不需要延迟扩展,计数器或goto语句.看看下面的代码:
@echo off
for /f "tokens=1* delims=:" %%a in ('findstr /n .* "c:\file_list.txt"') do if "%%a"=="%1" set line=%%b
echo.%line%
Run Code Online (Sandbox Code Playgroud)
这是导致我进行上述修改的原因.假设您有以下文件内容:
Some text on line 1
Blah blah blah
More text
Run Code Online (Sandbox Code Playgroud)
我做的第一件事就是改变(c:\ file_list.txt) .to ('findstr/n.*"c:\ file_list.txt"').
现在每个行在for循环中看起来像这样:
1:Some text on line 1
2:Blah blah blah
3:More text
Run Code Online (Sandbox Code Playgroud)
接下来,我们使用"tokens = 1*delims =:"来分解行号和内容.
现在,当我们遍历文件时,%% a将返回当前行号,%% b将返回该行的内容.
剩下的就是将%1参数与%% a(而不是计数器变量)进行比较,并使用%% b来存储当前行内容:if"%% a"=="%1"set line = %% b.
另外一个好处是不再需要' enabledelayedexpansion ',因为上面的代码消除了在for循环中间读取计数器变量.
编辑:将' echo%line% '更改为' echo.%line% '.这将正确显示空行,而不是"ECHO关闭".更改了' type c:\ file_list.txt ^ | findstr/n.* '到' findstr/n.*"c:\ file_list.txt" ',因为 findstr命令已经可以直接读取文件.
杰布,我想我已经解决了所有特殊问题.试一试:
for /f "tokens=*" %%a in ('findstr /n .* "c:\file_list.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!
endlocal
)
)
Run Code Online (Sandbox Code Playgroud)
呸,它吃了我的格式。
@echo off
setlocal enabledelayedexpansion
set /a counter=0
set %%a = ""
for /f "usebackq delims=" %%a in (c:\file_list.txt) do (if "!counter!"=="%1" goto :printme & set /a counter+=1)
:printme
echo %%a%
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30577 次 |
| 最近记录: |