Windows 如何将FOR循环输出转换为文本文件?

Windows 如何将FOR循环输出转换为文本文件?,windows,for-loop,cmd,Windows,For Loop,Cmd,如何将for循环输出保存在文本文件中 git init & git remote add origin https://gitlab.company.com/project.git & (git fetch -v > test.txt) 我的尝试是 for /F "tokens=5-6" %K in ('git fetch -v 2^>^&1 ^| findstr /B /C:"Receiving objects:"') do echo %K %L 这里我

如何将for循环输出保存在文本文件中

git init & git remote add origin https://gitlab.company.com/project.git & (git fetch -v > test.txt)
我的尝试是

for /F "tokens=5-6" %K in ('git fetch -v 2^>^&1 ^| findstr /B /C:"Receiving objects:"') do echo %K %L
这里我需要从windows cmd.exe输出中获取行粗体格式的行

远程:计数对象:760,完成。
远程:压缩对象:100%(366/366),完成。
远程:总计760(增量429),重复使用688(增量386)R
接收对象:100%(760/760),8.02 MiB | 436.00 KiB/s,完成。
解析增量:100%(429/429),完成

坦率地说,我不知道这条线是怎么运作的。我是cmd.exe的新手

[或]

如何在文本文件中获取抓取细节

git init & git remote add origin https://gitlab.company.com/project.git & (git fetch -v > test.txt)

要么我需要在文本文件中获取它,要么在C#编码中获取字符串。

实际上不清楚要将哪些数据写入哪个文件。我假设您希望从
接收对象开始的行:
只是
8.02 MiB
写入我在下面的批处理代码
info.txt
中命名的文件

@echo off
del info.txt 2>nul
for /F "tokens=1,2,5,6" %%A in ('git fetch -v 2^>^&1') do (
    if "%%A %%B" == "Receiving objects:" echo %%C %%D>>Info.txt
)
FOR的命令执行命令行
git fetch-v2>&1

使用
2>&1
将输出到STDERR的错误重定向到STDOUT,其中必须使用插入符号
^
对操作符
&
进行转义,以便在Windows命令解释器解析命令行时将其解释为文字字符,但是稍后执行被解释为重定向操作符的
git fetch-v2>&1

我不知道您的任务是否真的需要将错误消息重定向到标准消息的标准输出句柄。我不这么认为,因此您很可能可以将
2^>^&1
替换为
2^>nul
,通过重定向设备nul来抑制
git
输出的错误消息

写入STDOUT的已执行命令的输出由FOR捕获并逐行处理。将跳过空行和以分号开头的行。使用指定的选项处理所有其他行

使用空格和制表符作为分隔符,的每一行拆分为子字符串(标记)。因此,兴趣线分为:

  • 接收
  • 对象:
  • 100%
  • (760/760),
  • 8.02
  • MiB
  • |
  • 436.00
  • KiB/s,
  • 完成。
  • 使用
    tokens=1,2,5,6
    时,指定只有第一、第二、第五和第六个字符串是感兴趣的,并且应该分配给循环变量。第一个变量分配给循环变量
    A
    ,该变量在FOR命令行中指定。第二个变量分配给ASCII表中的下一个循环变量,即
    B
    。这就是为什么循环变量区分大小写,而环境变量不区分大小写的原因。第五个字符串分配给循环变量
    C
    ,第六个字符串分配给循环变量
    D

    如果
    可以确定至少一个令牌(本例中的第一个字符串),它将执行命令

    IF条件将行中的前两个区分大小写的标记与
    接收对象之间的空格进行比较:
    ,以确定当前行是否是包含感兴趣数据的行

    如果此字符串比较成功,则其他两个标记将输出到STDOUT,并重定向到一个文件中,如果输出包含多行
    接收对象:
    ,则添加数据

    但如果希望将整行写入文本文件,可以使用:

    @echo off
    del info.txt 2>nul
    for /F "tokens=1,2*" %%A in ('git fetch -v 2^>^&1') do (
        if "%%A %%B" == "Receiving objects:" echo %%A %%B %%C>>Info.txt
    )
    
    2
    后面的星号表示在获得第二个空格/制表符分隔的字符串后,该行的其余部分不应进一步拆分并分配给第三个循环变量
    C
    ,这对于本输入示例意味着:

    • A
      <代码>接收
    • B
      <代码>对象:
    • C
      <代码>100%(760/760),8.02 MiB | 436.00 KiB/s,完成。
    但是,对于仅获取以接收对象开头的所有行:写入文件
    info.txt
    ,可以在命令提示窗口中使用以下命令行:

    git fetch -v | findstr /B /C:"Receiving objects:" >info.txt
    
    要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

    • del/?
    • echo/?
    • findstr/?
    • 获取/?

    还可以阅读有关的Microsoft文章。

    我不使用bat文件,而是直接在命令提示符中使用它。我使用此命令
    del info.txt 2>nul用于/F“tokens=1,2,5,6”%%A in('git fetch-v 2^>^&1')如果“%A%B”=”接收对象,则在windows命令提示符中执行:“echo%C%D>>info.txt
    ”。但是我在文本文件中得到了输出
    C:\Users\path\Info.txt
    ,作为命令输出的帮助,
    FOR/?
    解释说,循环变量必须在命令提示符下用
    %I
    引用,并且在批处理文件中用
    %I
    引用。您对
    %A%B
    %C%D
    执行了此操作,但忘记在循环变量定义中将
    %A
    更改为
    %A
    。我在答案中还添加了一个命令行,用于过滤写入文本文件的以“Receiving objects:”开头的行的输出。如果我运行命令
    del info.txt 2>nul for/F“tokens=1,2,5,6”%a in('git fetch-v 2^>^&1'),如果“%a%B”=“Receiving objects:”echo%C%D>>Info.txt
    在cmd.exe中,如果我运行
    git fetch-v | findstr/B/C:“接收对象:”>Info.txt
    maens,我会得到Info.txt文件中的文本