Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 使用for循环在一个范围内标记并排序_Batch File - Fatal编程技术网

Batch file 使用for循环在一个范围内标记并排序

Batch file 使用for循环在一个范围内标记并排序,batch-file,Batch File,我的问题是:我有一个.txt字符串文件,我想在1到4之间对其进行排序和标记。删除3和4时,我只想保留项目1和2。我知道我可以使用%4在删除2和3时保留0和1标记化项,但问题是在调制时使用if语句,并在整个文件中执行该操作。文件大小将至少为5000/n行长 这是我迄今为止最成功的代码。我使用代码I作为基础 @echo on for /f "tokens=*" %%a in ('findstr /n .* "C:\...\TEXTFILE.txt"') do

我的问题是:我有一个
.txt
字符串文件,我想在1到4之间对其进行排序和标记。删除3和4时,我只想保留项目1和2。我知道我可以使用
%4
在删除2和3时保留0和1标记化项,但问题是在调制时使用if语句,并在整个文件中执行该操作。文件大小将至少为5000/n行长

这是我迄今为止最成功的代码。我使用代码I作为基础

@echo on
for /f "tokens=*" %%a in ('findstr /n .* "C:\...\TEXTFILE.txt"') do (
    set "FullLine=%%a"
    for /f "tokens=1* delims=:" %%b in ("%%a") do (
        setlocal enabledelayedexpansion
        set "LineData=!FullLine:*:=!"
        set /a MODVAR = %%b%%2
        if %%b == !MODVAR! >"TEXTFILE.txt" echo(!LineData! 
        endlocal
    )
)
pause
这将仅替换第1行中的文本。我知道我说过我想要第1行和第2行,但我想我会使用
else
语句来获得第二行。在我尝试这个问题之前,只需要使用当前代码就可以了

我已经读到使用正则表达式查找和替换会更容易,但是我更喜欢使用批处理来找到解决方案,这样我就可以编写(获取)当前代码并完成。而不是复制/粘贴可能多次

编辑:我的初始文本文档的一个示例是:

    aaa
    bbb
    ccc
    ddd
    eee

(以此类推)我只想保留aaa、bbb和eee,我只关注您给出的第
3行和第
4行的示例

根据您的示例,在单个文件上:

@echo off
setlocal enabledelayedexpansion
set "file=C:\...\TEXTFILE.txt"
for /f "tokens=*" %%f in ('type "!file!" ^| find /v /n "" ^& break ^> "!file!"') do (
         set "line=%%f"
         if "!line:~0,3!" == "[3]" set "line="
         if "!line:~0,3!" == "[4]" set "line="
         if defined line set "line=!line:*]=!"
         if defined line echo(!line!)>>"!file!"
   )
或者循环浏览所有
.txt
文件,并删除
3
4

@echo off
setlocal enabledelayedexpansion
for %%i in (*.txt) do (
    set "file=%%~i"
    for /f "tokens=*" %%f in ('type "!file!" ^| find /v /n "" ^& break ^> "!file!"') do (
         set "line=%%f"
         if "!line:~0,3!" == "[3]" set "line="
         if "!line:~0,3!" == "[4]" set "line="
         if defined line set "line=!line:*]=!"
         if defined line echo(!line!)>>"!file!"
   )
)
为了理解发生了什么:我们在文件中键入,使用括号中的
find/v/n
添加行号。i、 e每行将附加行的开头
[1]
[2]

然后我们进行匹配,查看前3个字符是否匹配
[3]
[4]
如果匹配,请清除变量。然后我们只需每次测试变量是否已定义,如果未定义(对于第3行和第4行),我们只需跳过
echo
ing这些行

因此,请给出以下示例:

aaa
bbb
ccc
ddd
eee
我之前键入文件,要查看内容,请运行批处理文件
,然后再次键入文件以查看结果:


我只关注您给出的第
3行和第
4行的示例

根据您的示例,在单个文件上:

@echo off
setlocal enabledelayedexpansion
set "file=C:\...\TEXTFILE.txt"
for /f "tokens=*" %%f in ('type "!file!" ^| find /v /n "" ^& break ^> "!file!"') do (
         set "line=%%f"
         if "!line:~0,3!" == "[3]" set "line="
         if "!line:~0,3!" == "[4]" set "line="
         if defined line set "line=!line:*]=!"
         if defined line echo(!line!)>>"!file!"
   )
或者循环浏览所有
.txt
文件,并删除
3
4

@echo off
setlocal enabledelayedexpansion
for %%i in (*.txt) do (
    set "file=%%~i"
    for /f "tokens=*" %%f in ('type "!file!" ^| find /v /n "" ^& break ^> "!file!"') do (
         set "line=%%f"
         if "!line:~0,3!" == "[3]" set "line="
         if "!line:~0,3!" == "[4]" set "line="
         if defined line set "line=!line:*]=!"
         if defined line echo(!line!)>>"!file!"
   )
)
为了理解发生了什么:我们在文件中键入,使用括号中的
find/v/n
添加行号。i、 e每行将附加行的开头
[1]
[2]

然后我们进行匹配,查看前3个字符是否匹配
[3]
[4]
如果匹配,请清除变量。然后我们只需每次测试变量是否已定义,如果未定义(对于第3行和第4行),我们只需跳过
echo
ing这些行

因此,请给出以下示例:

aaa
bbb
ccc
ddd
eee
我之前键入文件,要查看内容,请运行批处理文件
,然后再次键入文件以查看结果:


如果你想“每n行”,模是很好的选择。特别是对于“take two,skip two”,有一种更好的方法(逻辑位AND)

我还将整个输出一次性放入输出文件。这比为每行打开文件、写入文件并再次关闭文件要快得多

拆下REM进行故障排除。它向您展示了
modvar
的具体情况

(注意:只有当
N
是二的幂(1,2,4,8,16,…)时,此方法才适用于“取N,跳过N”)

为了完整起见,以下是如何使用模运算:

@echo off
setlocal enabledelayedexpansion

(for /f "tokens=1* delims=:" %%i in ('findstr /n "^" in.txt') do (
  set /a "modvar=(%%i-1) %% 4"
  REM echo %%i, !modvar!,   %%j >con
  if !modvar! lss 2 echo(%%j
))>out.txt

如果你想要“每n行”,模是很棒的。特别是对于“take two,skip two”,有一种更好的方法(逻辑位AND)

我还将整个输出一次性放入输出文件。这比为每行打开文件、写入文件并再次关闭文件要快得多

拆下REM进行故障排除。它向您展示了
modvar
的具体情况

(注意:只有当
N
是二的幂(1,2,4,8,16,…)时,此方法才适用于“取N,跳过N”)

为了完整起见,以下是如何使用模运算:

@echo off
setlocal enabledelayedexpansion

(for /f "tokens=1* delims=:" %%i in ('findstr /n "^" in.txt') do (
  set /a "modvar=(%%i-1) %% 4"
  REM echo %%i, !modvar!,   %%j >con
  if !modvar! lss 2 echo(%%j
))>out.txt

从您对实际任务的描述中,我不能完全确定,因此这是我对它的阅读,您的意图是将文件中的行重新创建为另一行,但省略了
3
4

这里有一种可能性,取决于是否必须保留选项卡:

@Echo关闭
SetLocal EnableExtensions DisableDelayedExpansion

从您对实际任务的描述中,我不能完全确定,因此这是我对它的阅读,您的意图是将文件中的行重新创建为另一行,但省略了
3
4

这里有一种可能性,取决于是否必须保留选项卡:

@Echo关闭
SetLocal EnableExtensions DisableDelayedExpansion

好的,我更喜欢看一个实际的用例,换句话说,显示输入的示例,并演示预期的输出结果。不清楚您的输入文本文件是什么样子的,请显示一个示例。复制的代码仅用于按行号选择单行。但是零件
set/a ccc=%%b%%2
看起来很奇怪。顺便说一句,您将
endlocal
放置在错误的位置place@jeb,是的,我同意,这是一种将值设置为1的奇怪方法。@Gerhard我编辑了endlocal,以及set/a变量,以避免在示例中混淆。我这样做的原因是因为我试图在if语句中简化模的使用,因为我找不到其他解决方法。我仍然不确定,我理解你的意思。是“两行,忽略两行,忽略两行,忽略两行…等等”吗?好吧,我更喜欢看一个实际的用例,换句话说,显示输入的示例和预期的输出结果。不清楚您的输入文本文件是什么样子的,请显示一个示例。复制的代码仅用于按行号选择单行。但零件
set/a ccc