批处理:用另一行

时间:2016-05-05 07:54:28

标签: batch-file cmd

我知道很多时候都会问过类似的问题,但我无法锻炼符合我需要的东西......

所以我有一个包含密钥的文件,该行开始如下:

SECRET_KEY = 

密钥是非固定长度。

我想找到这一行,将其保存在某个地方,用另一个文件替换包含密钥的所有文件(非常相似,但使用我不想要的不同密钥),并重新引入原始文件新文件中的密钥!

所以目前我有这段代码:

echo Saving the actual SECRET_KEY...
findstr "SECRET_KEY" somefile.py > SECRET_KEY.txt
echo Copying source code files...
xcopy %~dp0\somepath %~dp0\someotherpath /EY

这部分工作正常,因为我已将原始密钥存储在文本文件中,并将文件替换为另一个(与其他文件,目录结构等一起...)

那么现在如何再次找到以SECRET_KEY开头的行并用SECRET_KEY.txt的内容替换所有行?

编辑: 我认为我取得了一些进展:

echo Saving the SECRET_KEY...
findstr "SECRET_KEY" inputfile.py > SECRET_KEY.txt

echo Copying source code files...
xcopy %~dp0\somepath %~dp0\someotherpath /EY

echo Restoring the SECRET_KEY...
setlocal EnableDelayedExpansion
for /F "delims=" %%a in ('findstr /I "SECRET_KEY" SECRET_KEY.txt') do set "secret_key=%%a"
echo !secret_key!
@echo off
set file=inputfile.py
set newline=!secret_key!
set insertline=23
set output=outputfile.py
(for /f "tokens=1* delims=[]" %%a in ('find /n /v "##" ^< "%file%"') do (
if "%%~a"=="%insertline%" (
echo !newline!
) ELSE (
echo.%%b
)
)) > %output%

然后我可以删除SECRET_KEY.TXT,inputfile.py,并将outputfile.py重命名为inputfile.py 很可能不是最有效的方式,但它有效......

除了一件事!我在这个输入文件中有很多特殊字符,这就是我使用的原因!secret_key!例如......

但我也有很多:

[some stuff]

并在outputfile中显示为:

[some stuff

所以我猜我很接近,但我找不到一个分隔符,可以让每个角色都被输出!

1 个答案:

答案 0 :(得分:1)

以下脚本首先从文件SECRET_KEY读取包含otherfile.py的行;然后它获取放置inputfile.py的输入文件SECRET_KEY的行数;之后它逐行读取文件inputfile.py,检查每个行号是否与之前找到的行号匹配;如果找到匹配项,则返回先前从文件otherfile.py收集的密钥,因此该行被替换;否则,该行返回未经编辑;输出数据写入文件outputfile.py

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "INFILE=inputfile.py"
set "OUTFILE=outputfile.py"
set "KEYFILE=otherfile.py"
set "KEYWORD=SECRET_KEY"

rem // Retrieve key from a file:
set "KEY="
setlocal EnableDelayedExpansion
for /F delims^=^ eol^= %%K in ('findstr /L /C:"!KEYWORD!" "%KEYFILE%"') do (
    endlocal
    set "KEY=%%K"
    rem // Toggle delayed expansion inside of the loop to not lose `!`:
    setlocal EnableDelayedExpansion
    rem // `goto` ensures to take *first* key; remove it to take *last* one;
    goto :CONT_KEY
)
:CONT_KEY
endlocal

rem // Retrieve line number where key is found:
set "LRPL="
setlocal EnableDelayedExpansion
for /F "delims=:" %%M in ('findstr /N /L /C:"!KEYWORD!" "%INFILE%"') do (
    endlocal
    set "LRPL=%%M"
    rem // Toggle delayed expansion inside of the loop to not lose `!`:
    setlocal EnableDelayedExpansion
    rem // `goto` ensures to take *first* key; remove it to take *last* one;
    goto :CONT_NUM
)
:CONT_NUM
endlocal

rem // Move line by line from one file to another and replace key:
> "%OUTFILE%" (
    rem /* Use `findstr` to precede every line with its line number plus `:`,
    rem    in order no line to appear empty to `for /F`, as this ignores such;
    rem    the prefix (up to and including the first `:`) is removed later: */
    for /F "delims=" %%L in ('findstr /N /R "^" "%INFILE%"') do (
        set "LINE=%%L"
        rem // Extract the prefixed number of the current line:
        for /F "delims=:" %%N in ("%%L") do set "LNUM=%%N"
        rem // Toggle delayed expansion inside of the loop to not lose `!`:
        setlocal EnableDelayedExpansion
        rem /* Check current line number against previously retrieved one
        rem    and replace line in case of a match: *//
        if !LNUM! EQU !LRPL! (echo(!KEY!) else (echo(!LINE:*:=!)
        endlocal
    )
)

endlocal
exit /B

请注意,KEYFILEINFILE变量(在脚本顶部定义)可以设置为相同的文件路径。但是,OUTFILE必须与INFILE不同;否则推荐的文件将被清空。

这仅包括将文件的SECRET_KEY行存储到变量以及通过先前存储的文件在文件中交换包含SECRET_KEY的行并将结果写入另一个文件的任务。