Board logo

标题: [求助]如何去掉文本前两行,要求保留空格 [打印本页]

作者: HUNRYBECKY     时间: 2008-7-24 22:23    标题: [求助]如何去掉文本前两行,要求保留空格

我有一个注册表如下:
?
cls
REGEDIT4

;SETUPPATH;D:\\OFFICE2003
[HKEY_CLASSES_ROOT\Installer\Products\4080110900063D11C8EF10054038389C]
"ProductName"="Microsoft Office Professional Edition 2003"
现在的问题是我要去掉前两行的?和cls,我使用下面的批处理
for /f "skip=2 tokens=1,2 delims=:" %%a in ('findstr /n ".*" "%ravel%"') do (if "%%b"=="" (echo.>>"%crackfile%") else (echo %%b>>"%crackfile%"))
虽然能输出空行,但是如果文本中有:的话也会被忽略掉后面的部分,如何解决。在线等待。。。。。。。。。。
作者: lxmxn     时间: 2008-7-24 22:25
tokens=1-2*
作者: HUNRYBECKY     时间: 2008-7-24 22:31
问题解决,如下
rem for /f "skip=2 tokens=1,2 delims=:" %%a in ('findstr /n ".*" "%ravel%"') do (if "%%b"=="" (echo.>>"%crackfile%") else (echo %%b>>"%crackfile%"))
for /f "delims=" %%a in ('findstr /n .* "%ravel%"') do (
   set str=%%a
   setlocal enabledelayedexpansion
   set str=!str:*:=!
   echo.!str!>>"%crackfile%"
   endlocal
)


不知道有没有更好的方法。
作者: HUNRYBECKY     时间: 2008-7-24 22:31
好久没有见到兄弟了。哈哈。能否清楚点?我试过好象不行。能否把代码发出来。
作者: obsolete     时间: 2008-7-24 22:38

for /f "skip=2 tokens=1,* delims=:" %%a in ('findstr /n .* input.txt') do echo.%%b>>result.txt

作者: lxmxn     时间: 2008-7-24 22:41
直接在命令行执行下面的试试:
for /f "skip=2 tokens=1* delims=: eol=~" %a in ('findstr /n .* your_reg_file') do @echo.%b>>result.txt

作者: lxmxn     时间: 2008-7-24 22:43
看来我慢了一步哈 ^_^

我也好久没看见兄了啊,在忙什么呢?
作者: HUNRYBECKY     时间: 2008-7-24 22:45
echo.%%b 这个东西好,我原来使用IF....ELSE 判断,没有达到效果。谢谢obsolete兄弟,非常满足要求。

for /f "skip=2 tokens=1,* delims=:" %%a in ('findstr /n .* "%ravel%"') do (if "%%b"=="" (echo.>>"%crackfile%") else (echo %%b>>"%crackfile%"))
这样也可以,我只是把tokens=1,* 搞成tokens=2,* ,呵呵,所以老是出来错误。

[ Last edited by HUNRYBECKY on 2008-7-24 at 10:51 PM ]
作者: HUNRYBECKY     时间: 2008-7-24 22:57
回L兄,最近整理关于加密解密的帖子,在前辈的基础上做了很多修改,这个批处理基本上可以解密所有的文本加密了。感觉还是 copy nul+%ravel% "%crackfile%"命令最简单方便。
下面整理完成了解密的帖子。
@echo off
mode con: cols=80 lines=25
for /f "tokens=2 delims=: " %%a in ('chcp') do set lan_chcp=%%a
:index
color 27
cls
echo                        ╭───────────────╮
echo                        │                              │
echo    ╭─────────┤      文 本 解 密 终 极 版    ├─────────╮
echo    │                  │                              │                  │
echo    │                  ╰───────────────╯                  │
echo    │                                                                      │
echo    │                                                                      │
echo    │     本工具用来对混淆编码类型的加密文本进行解密,能自动分辨加密类型!   │
echo    │     本批处理是根据cn-dos等多位前辈的帖子整理出来的,在此表示感谢      │
echo    │     请输入批处理回车,也可拖放批处理至本窗体或本解密文件.             │
echo    │     解密成功后会在本程序目录下生成"crack_原文件名" 格式的文件.       │
echo    │     注意:解密后将替换本目录下的"crack_原文件名"文件,所以请自行备份.  │
echo    │                                                                      │
echo    │                                                                      │
echo    ╰───────────────────────────────────╯
echo.
if not "%1"=="" set ravel=%*
if "%ravel%"=="" set /p ravel=请输入要解密的文件全名:
if "%ravel%"=="" goto:err
dir /a "%ravel%"
cls
if "%errorlevel%"=="0" goto:go

:err
cls
echo                              ╭──────────╮
echo          ╭─────────┤   文  件  错  误   ├────────╮
echo          │                  ╰──────────╯                │
echo          │                                                          │
echo          │    指定文件不存在或输入了空字符串!                       │
echo          │    按任意键重新输入...                                   │
echo          │                                                          │
echo          ╰─────────────────────────────╯
echo.
echo.
pause >nul
set ravel=
goto index

:go
rem 使用TYPE命令(使用变数%%a字符写入文件首行加密文件,适合非批处理如注册表加密的解密)试探加密类型,如果失败则使用其他方式解密,注意这里的变量crackfile需要完整路径,否则拖动方式产生的文件会在用户当前目录
set "ravel=%ravel:"=%"
for /f "tokens=*" %%I in ("%ravel%") do set crackfile=%%~dpIcrack_%%~nxI
if exist "%crackfile%" del /f/q "%crackfile%"
type "%ravel%"|FINDSTR /I "%%a.*%%a.*%%a.*%%a.*%%a.*%%a.*%%a.*%%a.*%%a.*%%a"
IF "%ERRORLEVEL%"=="1" goto:try
type "%ravel%"|FINDSTR /I/V "%%a.*%%a.*%%a.*%%a.*%%a.*%%a.*%%a.*%%a.*%%a.*%%a">%crackfile%
goto:end

:try
rem 1.使用最简单的COPY命令,会产生两行多余字符,不会过滤空行,如果是注册表文件必须使用方法二去掉前两行
rem ----------------------------------------------------------------------
rem copy nul+%ravel% "%crackfile%"
rem goto :end
rem ----------------------------------------------------------------------

rem 2.使用for结合findstr /n 命令,也只需要一句命令非常简单,注意如果不使用findstr /n则会过滤掉空行
for /f "skip=2 tokens=1,* delims=:" %%a in ('findstr /n .* "%ravel%"') do echo.%%b>>"%crackfile%"
rem for /f "skip=2 delims=" %%a in ('findstr /n .* "%ravel%"') do (
rem    cls
rem    set str=%%a
rem    setlocal enabledelayedexpansion
rem    set str=!str:*:=!
rem    echo.!str!>>"%crackfile%"
rem    endlocal
rem )
goto:end

rem 3.使用debug方法,此方法也会产生多余行,需要FOR命令做二次处理,注意变量"%~dp1crack_%~nx1"在CALL中的应用.
copy %ravel% unenc.tmp
echo e 100 40,40,40,40>~debug
echo w>>~debug
echo q>>~debug
debug unenc.tmp<~debug
del ~debug
chcp %lan_chcp%
cls
call :ok %ravel%
goto :end
:ok
type unenc.tmp|FINDSTR /I/V "@@@@">unenc1.tmp
for /f "skip=2 tokens=1,2 delims=:" %%a in ('findstr /n ".*" "unenc.tmp"') do (if "%%b"=="" (echo.>>unenc1.tmp) else (echo %%b>>unenc1.tmp))
for /f "skip=2 delims=" %%a in (unenc.tmp) do echo "%%a">>unenc1.tmp
unenc1.tmp "%~dp1crack_%~nx1"
del /q/f unenc.tmp
del /q/f unenc1.tmp

:end
cls
echo                              ╭──────────╮
echo          ╭─────────┤   解  密  成  功   ├────────╮
echo          │                  ╰──────────╯                │
echo          │                                                          │
echo          │    恭喜, 批处理解密成功!                                 │
echo          │                                                          │
echo          ╰─────────────────────────────╯
echo 按任意键退出...
pause >nul
exit
[ Last edited by HUNRYBECKY on 2008-7-24 at 11:00 PM ]
作者: fastslz     时间: 2008-7-24 23:02
都复杂化了^_^
more +2 input.txt>result.txt

作者: HUNRYBECKY     时间: 2008-7-24 23:07
对了。for /f "skip=2 tokens=1* delims=: eol=~" %a in ('findstr /n .* your_reg_file') do @echo.%b>>result.txt
测试还是发现问题,如果批处理中有以冒号开头如“:start”则结果会把冒号“:”过滤掉。使用三楼的方法则不会过滤。不知道有没有解决方法,估计是使用findstr /n加行号后本身就有:所引起的。

[ Last edited by HUNRYBECKY on 2008-7-24 at 11:27 PM ]
作者: HUNRYBECKY     时间: 2008-7-24 23:11
more +2 input.txt>result.txt
兄弟的方法通不过,如果使用DEBUG加密的话输出的是空文本
作者: HAT     时间: 2008-7-25 12:09
凑热闹
sed "1,2d" a.txt
sed.exe
http://upload.cn-dos.net/img/561.zip
作者: yishanju     时间: 2008-7-25 12:50
sed 处理文本很好玩,我昨天刚学的SED 然后就把一千多个文本给处理出来了
我装的gnu sed 4.1.5
作者: HUNRYBECKY     时间: 2008-7-30 08:38
SEd 是个好工具。简单方便。