Batch file 按批处理文件从命令行输出中提取编号

Batch file 按批处理文件从命令行输出中提取编号,batch-file,Batch File,我有一个批处理脚本,它将提交证书请求,并在CMD中返回多个RequestId。我希望批处理文件能够提取出所有的数字,并使用名为RequestID的文件名逐行存储在文件中 下面是执行脚本后命令行的输出 C:\OpenSSL\bin>RequestCert.bat Generating a 2048 bit RSA private key ...................................................................+++ ...

我有一个批处理脚本,它将提交证书请求,并在CMD中返回多个RequestId。我希望批处理文件能够提取出所有的数字,并使用名为RequestID的文件名逐行存储在文件中

下面是执行脚本后命令行的输出

 C:\OpenSSL\bin>RequestCert.bat
 Generating a 2048 bit RSA private key
 ...................................................................+++
 ...........+++
 writing new private key to 'xxxx'
 -----
 No value provided for Subject Attribute ST, skipped
 RequestId: 1892
 RequestId: "1892"
 Certificate request is pending: Taken Under Submission (0)
 Generating certificate request and key for xxxx
 ECHO is off.
 ------------------------------------------------------------------------
 Generating a 2048 bit RSA private key
 ........+++ 
 ...........................................................................
 ..........+++
 writing new private key to 'xxxx'
 -----
 No value provided for Subject Attribute ST, skipped
 RequestId: 1893
 RequestId: "1893"
 Certificate request is pending: Taken Under Submission (0)
 Generating certificate request and key for xxxx
 ------------------------------------------------------------------------
 Please approve the certificates before pressing enter.
 Please approve the certificates before pressing enter.
 Please approve the certificates before pressing enter.
 Press any key to continue . . . 
因此,代码应该在RequestId之后提取出数字:

RequestId: 1892
RequestId: 1893
该文件应具有:

 1892
 1893
之后,它将获取文件的第一个编号和最后一个编号,并将其回显出来。 例如,请批准从请求ID 900到920的证书

以下是我尝试过的:

for /f "tokens=2 delims=:" %%b in ('"C:\program Files\command.exe"'|find 
"RequestId : ") do (
 echo %%b >> RequestID.txt
)

为了测试下面的批处理代码,我创建了带有以下行的文件
Input.txt

No value provided for Subject Attribute ST, skipped
RequestId: 1892
RequestId: "1892"
Certificate request is pending: Taken Under Submission (0)
Generating certificate request and key for xxxx
No value provided for Subject Attribute ST, skipped
RequestId: 1893
RequestId: "1893"
Certificate request is pending: Taken Under Submission (0)
Generating certificate request and key for xxxx
下面的批处理代码被写入文件
GetNumbers.bat
,该文件与
Input.txt
存储在同一目录中

@echo off
del Output.txt 2>nul
for /F "tokens=1,2" %%I in (Input.txt) do if "%%I" == "RequestId:" if %%J == %%~J echo %%J>>Output.txt
在命令提示窗口内执行批处理文件时,当前目录为
Input.txt
GetNumbers.bat
目录,通过键入批处理文件名并按回车键,没有显示错误,批处理文件创建为
Output.txt
,有两行:

1892
1893
完成了编码任务

FOR命令处理文件
Input.txt
中的每一行,该行不为空或以分号开头

它使用普通空格和水平制表符作为字符串分隔符,将每行拆分为子字符串(标记)

第一个空格/制表符分隔的字符串被分配给循环变量
I
,由于
tokens=1,2
,第二个字符串被分配给循环变量
J
,作为中
I
之后的下一个字符

当至少有一个令牌可以分配给第一个循环变量
I
时,执行的body命令块中的命令

body命令块中的IF条件将当前行中第一个空格/制表符分隔的字符串区分大小写与
RequestId:
进行比较,以验证此行是否包含感兴趣的编号

如果此如果条件为真,则批处理代码期望第二个循环变量
J
也被设置,并且只有感兴趣的数量或双引号中的感兴趣的数量

因此,进行比较,比较循环变量
J
的值与循环变量
J
的值,不使用双引号。在使用IF命令比较两个字符串时,也会考虑周围的双引号。因此,只有当
J
的数字没有双引号时,此比较才是正确的

不带双引号的数字将附加到文件
Output.txt

@echo off
del Output.txt 2>nul
for /F "tokens=1,2" %%I in (Input.txt) do if "%%I" == "RequestId:" if %%J == %%~J echo %%J>>Output.txt
下面的代码会稍微慢一点,但更安全:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "DoubleQuote=""
del Output.txt 2>nul
for /F "tokens=1,2" %%I in (Input.txt) do (
    if "%%I" == "RequestId:" if "%%~J" NEQ "" (
        set "Number=%%J"
        if "!Number:~0,1!" NEQ "!DoubleQuote!" echo !Number!>>Output.txt
    )
)
endlocal
使用此批处理代码循环变量
J
也可以没有指定的字符串,或者第一批处理代码将在出现语法错误时退出的字符串

在两个批处理代码块中,文件名
Input.txt
也可以替换为:

'command line which outputs the text to process'
请注意,如果字符串应被解释为要处理的行的文件名或要在单独的命令进程中执行的命令行的文件名,在该命令进程的后台,要从handleSTDOUT捕获输出并逐行处理,则周围的直接单引号会对产生影响

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • del/?
  • echo/?
  • endlocal/?
  • 获取/?
  • 如果/?
  • 设置/?
  • setlocal/?

另请阅读有关Microsoft的文章。

谢谢您的帮助。真是一篇很长的文章,还有很多东西需要消化,哈哈。