2016-08-31 8 views
1

証明書情報を含むテキストファイルを生成し、テキストの最初の半分がキーファイルに保存されるように半分に分割しようとしています残りの半分は証明書ファイルに保存されます。私は、新しい証明書ファイルへの下半分を節約するためにファイルを半分から2つの新しいテキストファイルに分割する(コマンドライン/バッチファイル)

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

あなたはこれらの増補行を反復処理するために、その行番号とファイルcert.txtとコロンとfor /Fループから読み取るすべての行の前にfindstr /Nを使用することができます。あなたは、現在の行数に応じて、それぞれの出力ファイルに(削除接頭辞を持つ)すべての単一の行をリダイレクトすることができます

@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 

次の2つの方法で、このスクリプトを設定することができます。

  1. セットKEYLINESへそのキーファイルに属する行数(7)を取得し、キーファイルに行数を出力し、それ以降の全ての行を証明書ファイルに出力する。この場合、CERTLINEは空白にしてください。
  2. 証明書ファイル(-----BEGIN CERTIFICATE-----)に属している最初の行にCERTLINEを設定すると、行がその文字列と一致するまでその行がキーファイルに出力されます。この場合、この行とそれ以降のすべてが証明書ファイルに出力されます; 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

関連する問題