2016-08-31 45 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

相關問題