2016-08-31 38 views
1

我生成了一个带有证书信息的文本文件,并试图将其拆分为一半,以便将文本的前半部分保存到密钥文件以及另一半到证书文件。我能够使用将文件拆分成两半到两个新的文本文件(命令行/批处理文件)

more +7 cert.txt > cert.crt 

保存下半部到一个新的证书文件,但我在努力如何上半年进入新的密钥文件。

这是通过一个批处理脚本完成的,该脚本远程发送到Windows机器上并在其上执行,因此只需使用Windows内置的命令即可完成。

实施例:

-----BEGIN PRIVATE KEY----- 
sample key data 
sample key data 
sample key data 
sample key data 
sample key data 
-----END PRIVATE KEY----- 
-----BEGIN CERTIFICATE----- 
sample cert data 
sample cert data 
sample cert data 
sample cert data 
sample cert data 
-----END CERTIFICATE----- 

回答

2

可以使用findstr /N先于从文件cert.txt其行号和冒号和for /F循环中读取通过这些增强线迭代每一行。然后,您可以重定向每一行(去掉前缀)到根据当前的行号对应的输出文件:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "FULLFILE=cert.txt" & rem // (combined input file) 
set "KEY_FILE=cert.key" & rem // (output key file) 
set "CERTFILE=cert.crt" & rem // (output certificate file) 
set "KEYLINES=7" & rem // (number of lines that belong to key file) 
set "CERTLINE=" & rem // (first line of text belonging to cert. file) 

if not defined KEYLINES set /A "KEYLINES=(1<<31)-1" 
for /F "delims=" %%L in (' 
    findstr /N /R "^" "%FULLFILE%" ^&^
     ^> "%KEY_FILE%" break ^&^
     ^> "%CERTFILE%" break 
') do (
    set "LINE=%%L" 
    set /A "LNUM=LINE" 
    setlocal EnableDelayedExpansion 
    if defined CERTLINE (
     if "!LINE:*:=!"=="!CERTLINE!" (
      endlocal 
      set /A "KEYLINES=0" 
      setlocal EnableDelayedExpansion 
     ) 
    ) 
    if !LNUM! LEQ !KEYLINES! (
     >> "!KEY_FILE!" echo(!LINE:*:=! 
    ) else (
     >> "!CERTFILE!" echo(!LINE:*:=! 
    ) 
    endlocal 
) 
endlocal 
exit /B 

您可以用两种方式配置此脚本:

  1. 设置KEYLINES到属于密钥文件的行数(7),以便将行数输出到密钥文件,并将所有其他行输出到证书文件;在这种情况下,CERTLINE应该是空的。
  2. CERTLINE设置为属于证书文件(-----BEGIN CERTIFICATE-----)的第一行,所以行被输出到密钥文件,直到一行符合该字符串,在这种情况下,此行和所有其他行将被输出到证书文件;那么KEYLINES应该是空的。
+0

太棒了!这应该非常感谢你!快速注意,设置输入和输出文件时,它们当前位于D:驱动器上,因此它们是否应附加以包含完整的文件位置?另外,当我执行批处理文件时,它确实创建了一个密钥文件,但其中的在线内容是'LINE:*:',而不是实际的文本。我说错了吗? – superfluousAM

+0

谢谢!是的,只需提供完整路径(例如'set“FULLFILE = D:\ Data \ cert.txt”')。我无法重现'LINE:*:'事物(用您问题的示例文件);一个错字可能?或者真正的文件路径/名称是否包含'!'字符? – aschipfl

+0

好吧,很酷,这就是我想的但只是想确定。我已经在你的初始注释之前实现了脚本,所以它不再输出'LINE:*:',但现在它只是输出'\ cert.txt“&>”D:\ cert.key“break&>”D:\ cert.crt“break”另一个语法问题可能吗? – superfluousAM

相关问题