我要求在Windows批处理文件中从文本文件中读取第一个可用行,将其传递给变量并将名称\ line标记为已使用
该文件的示例如下。
苹果
梨
橙色
该脚本将以' apple'开头,传递' apple'到稍后在脚本中使用的变量(我知道该怎么做),然后将该行写回读取& apple,'&'作为标记说它已被使用。
该文件将如下所示:
&安培;苹果
梨
橙色
下次运行批处理文件时,需要将其传递给变量并用&标记它。使它看起来像:
&安培;苹果
&安培;梨
橙色
我开始尝试寻找'&'然后尝试移动到下一行,但是在尝试了大约12个小时后我失败了。这是我到目前为止所做的......并不多:
for / f"令牌= 1" (' name.txt')中的%l(查找/ v"&" / v" ^ ---- ^ $")(对于/ F%n in(%l)do(设置NewName =%n))
由于
答案 0 :(得分:6)
在the.file
上运行此功能会依次修改每一行;
@echo off
setlocal enabledelayedexpansion
type nul > the.file.temp
set last=
for /F "tokens=*" %%A in (the.file) do (
set line=%%A
if "!line:~0,1!" neq "&" if "!last!" equ "" (
set last=!line!
set line=^&!line!
)
echo !line! >> the.file.temp
)
echo last value is !last!
type the.file.temp > the.file
(如果该行不以&
开头且变量last
为空,请将该行放在last
并修改line
中,并带有{{1}始终将&
附加到临时文件,完成后重命名)
答案 1 :(得分:3)
Alex k。有一个很好的答案,对大多数情况可能都很好。 (我投了赞成票。)
但是,它会破坏包含!
的任何文字。可以通过在循环内切换延迟扩展来修复该限制。
对于大多数合理大小的文件,解决方案可能足够快。但对于大型文件,FOR循环可能变得非常慢。
我测试了一个包含2817行的190kb文件,而Alex K.解决方案一次运行需要20秒。
这是一个完全不同的解决方案,不使用任何循环在0.07秒内处理相同的190kb文件 - 快285倍:)
@echo off
setlocal enableDelayedExpansion
set "file=test.txt"
findstr /bv "$ &" "%file%" >"%file%.available"
set "var="
<"%file%.available" set /p "var="
if defined var (
>"%file%.new" (
findstr /b "&" "%file%"
<nul set /p "=&"
type "%file%.available"
)
move /y "%file%.new" "%file%" >nul
)
del "%file%.available"
echo var=!var!
更新: 根据评论中的要求,以下是代码的评论很多的版本。
@echo off
setlocal enableDelayedExpansion
:: Define the file to process
set "file=test.txt"
:: Write the unused lines to a temporary "available" file. We don't want any
:: empty lines, so I strip them out here. There are two regex search strings;
:: the first looks for empty lines, the second for lines starting with &.
:: The /v option means only write lines that don't match either search string.
findstr /bv "$ &" "%file%" >"%file%.available"
:: Read the first available line into a variable
set "var="
<"%file%.available" set /p "var="
:: If var defined, then continue, else we are done
if defined var (
REM Redirect output to a "new" file. It is more efficient to redirect
REM the entire block once than it is to redirect each command individulally
>"%file%.new" (
REM Write the already used lines to the "new" file
findstr /b "&" "%file%"
REM Append the & without a new line
<nul set /p "=&"
REM Append the unused lines from the "available" file. The first appended
REM line is marked as used because of the previously written &
type "%file%.available"
)
REM Replace the original file with the "new" content
move /y "%file%.new" "%file%" >nul
)
:: Delete the temp "available" file
del "%file%.available"
:: Display the result
echo var=!var!
我没有对此进行测试,但我刚刚意识到我可以编写可用行的行来查找以&
以外的字符开头的行:
findstr "^[^&]" "%file%" >"%file%.available"