将文件分成两半到两个新文本文件(命令行/批处理文件)

时间:2016-08-31 00:01:43

标签: windows batch-file cmd

我生成了一个带有证书信息的文本文件,并尝试将其分成两半,以便将文本的前半部分保存到密钥文件中,将另一半文件保存到证书文件中。我能够使用

more +7 cert.txt > cert.crt

将下半部分保存到新的证书文件中,但我正在努力解决如何将上半部分转换为新的密钥文件。

这是通过批量脚本完成的,该脚本远程发送到Windows机器并在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-----

1 个答案:

答案 0 :(得分: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应为空。
相关问题