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