循环批处理-运行python命令时出错

循环批处理-运行python命令时出错,python,windows,for-loop,batch-file,cmd,Python,Windows,For Loop,Batch File,Cmd,我试图在FOR循环中运行这个base64解码- SETLOCAL EnableDelayedExpansion FOR /F "tokens=1,2 delims= " %%a IN (file.txt) DO ( FOR /F "tokens=* USEBACKQ" %%g IN (`echo %%a | python -m base64 -d`) do (SET "decode1=%%g") <nul set /p =!decode1! >> new2.txt

我试图在FOR循环中运行这个base64解码-

SETLOCAL EnableDelayedExpansion

FOR /F "tokens=1,2 delims= " %%a IN (file.txt) DO (
     FOR /F "tokens=* USEBACKQ" %%g IN (`echo %%a | python -m base64 -d`) do (SET "decode1=%%g")
<nul set /p =!decode1! >> new2.txt
echo. >> new2.txt
)
这避免了在
for
循环中摆弄…
set/p
等,让Python读取
file.txt
并将输出重定向到
new2.txt
。如果输出文件编码是一个问题,那么Python或许也可以编写


如果有必要,请使用Python 3.8进行测试。

代码中的主要问题是缺少转义,如中所示,还有:

对于(`echo%%a | python-m base64-d`)do中的/F“tokens=*USEBACKQ”%%g(设置“decode1=%%g”)
应改为:

对于(`echo%%a^ python-m base64-d`)do中的/F“tokens=*USEBACKQ”%%%g(设置“decode1=%g”)
为了隐藏管道
|
,从处理整个
for/F
循环定义的第一个解析阶段开始

此外,我建议使用
set/p=“!decode1!”
而不是
set/p=!解码1
以保留变量值
decode1
中可能出现的周围引号


无论如何,我想提供一种转换方法的替代方法,基于Windows XP提供的工具,我认为:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_SEP=“&rem/(输出的分隔符或字符串)
设置“\u TMP=%TEMP%\%~n0\u%RANDOM%.TMP”&rem/(用于转换单个项目的临时文件)
设置“\u CHR=%TEMP%\%~n0\u%RANDOM%.CHR”&rem//(临时文件仅包含给定的分隔符)
rem//创建一个临时文件,该文件只包含指定的单个分隔符:
>文件数量/P“%~dp0.”/M“%~nx0”/C“cmd/V/C^>0x22!\u CHR!0x22 echo(!\u SEP!0x1A”
>nul复制“%\u CHR%”/A+nul“%\u CHR%”/B
rem//循环通过从控制台输入读取的所有非空行:
对于/F“令牌=*eol=“%%L in('more')do(
rem//显式拒绝通配符,该通配符将在以后导致'for'循环出现问题:
对于/F“delims=*?eol=*”(%%L”)中的%%C,如果不是“%%C”==“%%L”(
>&2回显“%%L”包含禁止字符!
)否则(
rem//循环当前行中以空格分隔的项目:
设置“第一个=#”
对于%%I in(%%L)do(
rem//根据Base64编码的所有有效字符列表检查当前项目:
(
对于/F“delims=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyz012456789+/=eol==”%D in(“%%I”)进行rem/
) && (
>&2回显“%%I”不是有效的Base64编码!
) || (
rem//实际执行当前项的Base64解码:
>“%\u TMP%”回波(%%I
>nul certutil-f-v-解码“%\u TMP%”“%\u TMP%”
rem//将结果数据写入控制台输出:
如果未定义第一种类型“%\u CHR%”
键入“%\u TMP%”
设置“FIRST=”
)
)
如果未定义第一个回波/
)
)
rem//清理临时文件:
删除“%\u TMP%”“%\u CHR%”
端部
退出/B
此脚本称为
decode-b64-chunks.bat
,从控制台读取Base64编码数据,并将解码数据写入控制台。要将问题中的示例输入文件
file.txt
转换为当前工作目录中的新文件,请使用以下命令行:

decode-b64-chunks.bat<“file.txt”>“new.txt”
名为
new.txt
的结果文件最终将包含以下文本:

CaSfZlexeGgV5ev2LlwBPw by 9thw3wqhxjpuvz9lqdrg
d4a0xGnwKL0Jkp8KJbJPvw 5lU85R4BTQVi0ltPsDERoA
DpGLA_KJhYiWnr7ssES9GA EG0owTZcX3e-30JTXNZMnA
gtojvQ1Ih38lb92Usi56ug-nk-wgvf2c4C-OH56MTW

上面的脚本包含我想讨论的代码的两个特定部分:

  • 显式拒绝通配符,该通配符将导致以后的
    循环出现问题:

    对于/F“delims=*?eol=*”%%C in(“%%L”)如果不是“%%C”==“%%L”(
    >&2回显“%%L”包含禁止字符!
    )否则(
    …
    )
    
    %%L
    包含当前行字符串。
    for/F
    循环的
    delims
    选项列出了所有通配符(
    *
    是众所周知的,但是
    是未记录的)。因此,如果当前行包含一个这样的字符,/F
    将以某种方式标记它,因此其元变量
    %%C
    不等于
    %%L
    中的原始行字符串,则跳过整行并返回错误消息

    排除这些行的原因是%%I in(%%L)do
    的循环
    ,该循环用于遍历行中以空格分隔的项。用于
    循环的标准
    (无
    /F
    开关)用于循环文件,但实际上它只在遇到至少一个通配符时访问文件系统,这是我想要阻止的

  • 根据Base64编码的所有有效字符列表检查当前项:

    )
    对于/F“delims=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyz012456789+/=eol==”%D in(“%%I”)进行rem/
    ) && (
    >&2回显“%%I”不是有效的Base64编码!
    ) || (
    …
    )
    
    delims
    选项列出Base64编码字符串中允许的所有字符。现在,如果一个项目
    %%I
    只包含这样的字符,那么它是一个只包含分隔符的行,而
    for/F
    跳过;如果出现任何其他字符,
    for/F
    将处理文本,但不会发生任何事情,因为循环体中只有
    rem/
    。无论如何,我只想知道/F的
    for
    是否迭代,因为这样我就知道所处理的
    FOR /F "tokens=1,2 delims= " %%a IN (file.txt) DO (
    echo %%a | python -m base64 -d > temp.txt
    set /p var1=<temp.txt
    <nul set /p =!var1! >> new.txt
    echo. >> new.txt
    )
    
    Q2FTZlpsZXhlR2dWNWV2Mkxsd0JQdw== Ylk5VEh3M1dRSFhqUHV2WjlMcURyZw==
    ZDRhMHhHbndLTDBKa3A4S0piSlB2dw== NWxVODVSNEJUUVZpMGx0UHNERVJvQQ==
    RHBHTEFfS0poWWlXbnI3c3NFUzlHQQ== RUcwb3dUWmNYM2UtMzBKVFhOWk1uQQ==
    Z3RvanZRMUloMzhsYjkyVXNpNTZ1Zw== LW5rLXdndmYyYzRDLW9oNWg1Nk1Udw==
    
    python -c "import base64, sys; f=open('file.txt', 'rb'); [print(base64.b64decode(lines.split()[0]).decode(), base64.b64decode(lines.split()[1]).decode()) for lines in f]; f.close()" > new2.txt