Batch file 如何使用批处理以自下而上的方式读取文本文件

Batch file 如何使用批处理以自下而上的方式读取文本文件,batch-file,cmd,Batch File,Cmd,我正在处理一个需要创建某些资源的项目,在创建资源的同时,我还将其写入一个文件,以便在出现错误时回滚创建过程。 但这里有一个陷阱,必须以与创建资源相反的方式删除资源,所以当我在回滚文件中这样写时: delete R1 delete R2 .. .. delete RN 我想按顺序删除资源-> delete RN delete RN-1 .... ... delete R1 在windows批处理中有这样做的方法吗?没有使用批处理以相反顺序读取文件的本机方法 但是,虽然不是最快的方法,但可以解决

我正在处理一个需要创建某些资源的项目,在创建资源的同时,我还将其写入一个文件,以便在出现错误时回滚创建过程。 但这里有一个陷阱,必须以与创建资源相反的方式删除资源,所以当我在回滚文件中这样写时:

delete R1
delete R2
..
..
delete RN
我想按顺序删除资源->

delete RN
delete RN-1
....
...
delete R1

在windows批处理中有这样做的方法吗?

没有使用批处理以相反顺序读取文件的本机方法

但是,虽然不是最快的方法,但可以解决以下问题:按正常顺序读取文件,在每行前面加上填充的数字,按相反顺序对列表进行排序,拆分行以分隔数字,然后处理列表

@echo关闭
setlocal enableextensions disabledelayedexpansion
设置“file=data.txt”
对于/f“代币=1,*delims=,”%a,在('
cmd/v:off/e/q/c“set”counter^=10000000“&for/f usebackq^delims^=^eol^=%%c in(“%file%”)do(set/a“counter+^=1”和echo(,%%c)”
^|分拣机
""做"(
回声%%b
)
工作原理:

对于输入文件中的每一行,代码将输出一个数字前缀和该行,并带有一个分隔符(
),以便以后能够分隔这两个元素

由于稍后将对数据进行排序,我们需要前缀具有统一的长度。因此,我们在
10000000
中初始化计数器,并将其增加,以便所有行中的前缀具有相同的长度(注意:如果您的文件有超过99999999行,请不要使用此方法)

要更改计数器,我们只需使用
设置/a“counter+=1”
,但要在循环中回显它,我们需要延迟扩展,但这可能会导致从文件读取的数据出现问题(我不知道它是否可以包含
字符)

我们可以启用/禁用延迟扩展来处理它,但由于这对每一行都是必需的,因此会出现性能损失。要解决此问题,代码将在单独的
cmd
实例中执行

为什么是一个单独的实例?这个单独实例中的代码不是在批处理上下文中执行的,而是在命令行上下文中执行的。在命令行上下文中,
set/a
命令回显计算结果,因此我们不需要这样做,延迟扩展问题消失。我们只需计算新计数器(得到回显),并回显从输入文件读取的分隔符和行

设置“计数器=10000000”
对于/f usebackq^delims^=^eol^=%%c in(“%file%”)do(
设置/a“计数器+=1”
回声(%%c
)
它以串联命令的形式编写,并作为参数传递给
cmd
实例(注意:
^
用于转义有问题的字符),该实例在
回送关闭(
/q
)、启用扩展(
/e
)和禁用延迟扩展(
/v:off
)的情况下执行

cmd/v:off/e/q/c“set”counter^=10000000“&for/f usebackq^delims^=^eol^=%%c in(“%file%”)do(set/a“counter+^=1”和echo(,%%c)
这将生成带前缀的输出。现在,要按相反顺序排序,输出将通过管道传输到
sort/r
命令

cmd/c“…”排序/r
由于需要处理管道的结果(在示例中,我们仅将
回送到控制台的行),在
for/f%%a
(更多
^
转义字符)中执行完整管道

for/f“tokens=1,*delims=,”%a in('
cmd/c“…”^排序/r
“)做。。。。
for
命令表示
字符将用作分隔符,以标记输入行(管道执行的结果),并且我们希望将第一个标记(数字前缀,不使用,但需要包含)检索到
%%a
和行的其余部分(无需额外拆分)在
%%b


因此,最后,
for/f%%a
do
子句中的代码将按相反顺序对输入文件中的每一行执行,该行存储在
%%b

中。这将反转文件中的文本行

交换

filter swap
反转文件中的行,使顶行成为底行

示例

cscript //nologo filter.vbs swap <"%systemroot%\win.ini"

delims=,“%%a
”中的
有什么用?请您更详细地解释您的解决方案。@SubhamTripathi,答案已更新。请检查是否足够清楚。您按哪个键来打印
,因为我在键盘上找不到:)@SubhamTripathi,对我来说是AltGr+6(西班牙语键盘),但您可以复制/粘贴它或使用几乎任何其他字符。选择数据中不包含的字符,或至少与每行的起始字符不匹配的字符。只需更改包含分隔符的
echo
,以及使用它的
delims
子句。不适用于我
alt+6
,我将我明白你的意思。但是我需要一个使用普通批处理的解决方案,谢谢你的帮助:)
Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
    Dim LineCount
    Set rs = CreateObject("ADODB.Recordset")
    With rs
        .Fields.Append "LineNumber", 4 
        .Fields.Append "Txt", 201, 5000 
        .Open
        LineCount = 0
        Do Until Inp.AtEndOfStream
            LineCount = LineCount + 1
            .AddNew
            .Fields("LineNumber").value = LineCount
            .Fields("Txt").value = Inp.readline
            .UpDate
        Loop
        .Sort = "LineNumber DESC"
        Do While not .EOF
            Outp.writeline .Fields("Txt").Value
            .MoveNext
        Loop
    End With