You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无外部工具的Batch混淆器中单独输出空格?

解决Batch混淆器空格丢失问题

你的问题根源在于set /p命令的特性:当用<nul set /p= 空格时,空格会被忽略无法输出;同时for /f "tokens=*"会自动截断行首空格,也会导致部分空格丢失。以下是针对性的修改方案:

修改后的完整脚本

@echo off
setlocal enabledelayedexpansion
set /a N=0
:file
set /p "file=Enter filename: "
if not exist "%file%" (
    echo Please try again. The file you specified does not exist.
    pause>nul
    cls
    goto file
)
cls
echo Please wait.
set /a overallfirst=1
set /a double=0
for /F "usebackq tokens=*" %%f in ("%file%") do goto start
:start
set /a "tamp=%random%"
set /a loop2=0
set /a rand=%random% %%5 +1
if %rand%==1 echo #> %tamp%
if %rand%==2 echo $> %tamp%
if %rand%==3 echo ?> %tamp%
if %rand%==4 echo z> %tamp%
if %rand%==5 echo j> %tamp%
:chars
if %loop2%==100 goto next
set /a rand=%random% %%5 +1
if %rand%==1 <nul set /p=#>> %tamp%
if %rand%==2 <nul set /p=$>> %tamp%
if %rand%==3 <nul set /p=?>> %tamp%
if %rand%==4 <nul set /p=z>> %tamp%
if %rand%==5 <nul set /p=j>> %tamp%
set /a loop2+=1
goto chars
:next
for /f "usebackq tokens=*" %%f in ("%tamp%") do set chars=%%f
set "start=^<nul set /p=%chars%^>^> Obfuscated.bat"
del %tamp%
set /a loop=-1
set /a first=1
for %%i in ("%file%") do @set count=%%~zi
echo @echo off> Chars.bat
echo setlocal enabledelayedexpansion>> Chars.bat
if %double%==0 echo echo.> Obfuscated.bat>> Chars.bat
echo for /f "usebackq delims=" %%a in ("%file%") do set id=%%a ^& call :processline %%a >> Chars.bat
echo cls>>Chars.bat
echo echo Obfuscated code:>>Chars.bat
echo echo -------------------------->>Chars.bat
echo type Obfuscated.bat>>Chars.bat
echo pause>nul>>Chars.bat
echo exit >> Chars.bat
echo goto :eof >> Chars.bat
echo :processline >> Chars.bat
:loop
set /a loop=%loop%+1
if %loop%==%count% goto end
if %first%==1 (
    set first=0
    goto other
)
:: 修改:生成字符判断逻辑
echo set "char=%%id:~%loop%,1%%">> Chars.bat
echo if "!char!"==" " (>> Chars.bat
echo     ^<nul set /p=" "^>> Obfuscated.bat>> Chars.bat
echo ) else (>> Chars.bat
echo     ^<nul set /p=!char!^>> Obfuscated.bat>> Chars.bat
echo )>> Chars.bat
goto next1
:other
set "command=%start%"
echo %command%>> Chars.bat
set /a loop=%loop%-1
goto loop
:next1
set /a "tamp=%random%"
set /a loop2=0
set /a rand=%random% %%5 +1
if %rand%==1 echo #> %tamp%
if %rand%==2 echo $> %tamp%
if %rand%==3 echo ?> %tamp%
if %rand%==4 echo z> %tamp%
if %rand%==5 echo j> %tamp%
:chars
if %loop2%==100 goto next2
set /a rand=%random% %%5 +1
if %rand%==1 <nul set /p=#>> %tamp%
if %rand%==2 <nul set /p=$>> %tamp%
if %rand%==3 <nul set /p=?>> %tamp%
if %rand%==4 <nul set /p=z>> %tamp%
if %rand%==5 <nul set /p=j>> %tamp%
set /a loop2+=1
goto chars
:next2
for /f "usebackq tokens=*" %%f in ("%tamp%") do set chars=%%f
set "command=^<nul set /p=%chars%"
echo %command%^>^> Obfuscated.bat>> Chars.bat
del %tamp%
goto loop
:end
echo echo. >> Obfuscated.bat>> Chars.bat
echo goto :eof >> Chars.bat
echo :eof >> Chars.bat
start Chars.bat
if %overallfirst%==1 (
    set /a overallfirst=0
    set /a double=1
)
endlocal

关键修改说明

  1. 启用延迟扩展:

    • 在主脚本和生成的Chars.bat开头都添加setlocal enabledelayedexpansion,确保循环中变量能正确动态取值。
  2. 保留行首空格:

    • 将for /f "tokens=*"改为for /f "delims=",避免for /f自动截断行首空格,确保整行内容完整读取。
  3. 正确输出空格:

    • 增加字符判断逻辑:当字符是空格时,用<nul set /p=" "输出(带引号的空格会被set /p正确识别);非空格字符保持原有方式输出。
  4. 代码优化:

    • 合并重复的文件存在性判断为块结构,提升可读性;给文件名添加引号,支持含空格的文件名。

现在运行修改后的脚本处理输入文件,手动移除随机字符后,空格会被完整保留,不会出现@echooff或echotest的情况。

内容的提问来源于stack exchange,提问作者John Davis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 14:10:36