2017-05-26 232 views
0

我有一个批处理脚本将提交证书请求,它将在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 
) 

回答

1

为了测试批号下面我创建的文件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 

下面的批处理代码被写入存储在与Input.txt相同的目录中的文件GetNumbers.bat

@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.txtGetNumbers.bat目录通过键入批处理文件名和击打键RETURN命令提示窗口内的批处理文件的执行没有错误显示,并且该批处理文件创建Output.txt两条线:

1892 
1893 

因此编码任务完成。

FOR命令处理文件Input.txt中的每行不是空的或以分号开头。

它使用普通空间和水平选项卡作为字符串分隔符将每行分割为子字符串(标记)。

第一空间/制表符分隔的字符串被分配给循环变量I和由于tokens=1,2第二之一被分配给循环变量J是在ASCII tableI之后的下一个字符。

当主体命令块FOR中的命令在至少1个令牌可被分配给第一循环变量I时被执行。

IF条件在身体命令块从当前行的第一空间/制表符分隔的字符串进行比较,区分大小写与RequestId:以验证是否该行包含感兴趣的数目。

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

因此,比较循环变量J的值与循环变量J的值,而不包围双引号。在将两个字符串与IF命令进行比较时,也会考虑周围的双引号。因此,如果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也可以没有分配的字符串或在其第一批代码将有语法错误而退出的字符串。

'command line which outputs the text to process' 

请注意,周围的直单引号做出为区别,如果该字符串应该被解释为文件名:

在这两个批次的代码块中的文件名Input.txt可以通过还更换其中要处理的行或命令行要在单独的命令进程中执行,并在后台执行输出以从句柄STDOUT中捕获并逐行处理。

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

  • del /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • set /?
  • setlocal /?

请阅读微软有关Using Command Redirection Operators的文章。

+0

感谢您的帮助。真的是一个很长的帖子,很多消化哈哈。 – Kaycee

相关问题