[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理怎样重定向输出?

我知道的有两种形式
一个是
  1. echo [InternetShortcut] >>a.url
  2. echo URL=c:\windows\system32\notepad.exe >>a.url
  3. echo IconIndex=20 >>a.url
  4. echo IconFile=C:\windows\system32\shell32.dll >>a.url
复制代码
一个是
  1. (
  2. echo [InternetShortcut]
  3. echo URL=c:\windows\system32\notepad.exe
  4. echo IconIndex=20
  5. echo IconFile=C:\windows\system32\shell32.dll
  6. )>a.url
复制代码
代码短的话手动更改就可以,如果代码很长,每一行前面都要加echo 就很费事。
能不能写一个批处理,输入要转换为重定向输出的文本,一下就变成了上面的形式了,不用手动更改。
比如reg、bat、txt有时候需要变换成上面的形式输出为新文件

1,如果内容中没有需要处理的变量,则直接使用 more ,优点是无敏感字符问题
2,如果文本中有需要处理的变量则使用 for /f 加 more 或 if 判断
3,如果内容只有几行,直接用 echo
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

倒腾来 倒腾去  A.BAT 内容 还是原文件 不是吗?

TOP

不行呀,第一个方案还不行,还是十四楼的测试代码,转换后的代码如下:
  1. (
  2. echo   ::=====================================================
  3. echo   :: code by freeants  CMD@XP  version:1.00
  4. echo   ::=====================================================
  5. echo   @echo off
  6. echo   cd/d "%~dp0">nul
  7. echo   if "%~z1" equ "" goto:usage
  8. echo   if %~z1 gtr 65280 goto:NOT_SUPPORT
  9. echo   setlocal ENABLEDELAYEDEXPANSION
  10. echo   copy/b "%~1" $$$>nul
  11. echo   set/a D_NUM=%~z1+255
  12. echo   call:DEC_HEX %D_NUM% >nul
  13. echo   echo @echo off>"%~n1.cmd"
  14. echo   echo more +5 "%%~0"^|debug^&graftabl 936^>nul>>"%~n1.cmd"
  15. echo   echo copy/b/y $tmp$ "%~nx1"^>nul>>"%~n1.cmd"
  16. echo   echo del/a/f/q $tmp$>>"%~n1.cmd"
  17. echo   echo goto:eof>>"%~n1.cmd"
  18. echo   for /f "eol=- skip=1 tokens=*" %%i in ('^(echo d100,%FILE_SIZE%^&echo q^)^|debug $$$^&^&del $$$') do (
  19. echo       set op=%%i
  20. echo       set op=-=
  21. echo       echo e~5,53 2>nul>>"%~n1.cmd"
  22. echo   )
  23. echo   echo rcx>>"%~n1.cmd"
  24. echo   call:DEC_HEX %~z1 >nul
  25. echo   echo %FILE_SIZE%>>"%~n1.cmd"
  26. echo   echo n$tmp$>>"%~n1.cmd"
  27. echo   echo w>>"%~n1.cmd"
  28. echo   echo q>>"%~n1.cmd"
  29. echo   goto :EOF
  30. echo   :DEC_HEX
  31. echo       set FILE_SIZE=
  32. echo       set PATTERN=123456789ABCDEF
  33. echo       set dec=%1
  34. echo       :WHILE
  35. echo       set /a res=%dec%%%16-1
  36. echo       set /a dec/=16
  37. echo       set res=~%res%,1
  38. echo       set FILE_SIZE=%res%%FILE_SIZE%
  39. echo       if "%dec%" neq "0" goto WHILE
  40. echo   goto:eof
  41. echo   :usage
  42. echo       echo.================================================
  43. echo       echo 你没有指定要处理的文件或指定的文件不存在……
  44. echo       echo.
  45. echo       echo 用法:
  46. echo       echo       %~n0 fileName
  47. echo       echo.================================================
  48. echo   goto:eof
  49. echo   :NOT_SUPPORT
  50. echo      echo 指定的文件过大,脚本(%~nx0)不能处理……
  51. echo      pause
  52. echo   goto:eof
  53. )>a.bat
复制代码
运行后还是无法生成a.bat

TOP

自动在>前面加一个^就可以了吧。

TOP

  1. > test.reg ECHO Windows Registry Editor Version 5.00
  2. >>test.reg ECHO.
  3. >>test.reg ECHO [HKEY_LOCAL_MACHINE\SOFTWARE]
复制代码
如果上面的不行的话,如果reg2bat转换成的bat,如果里面有特殊字符,最后用这个bat生成的reg文件也是有问题或者无法生成的吗。就是说这个转换并不是很保险是吗?

TOP

是的,比如
echo echo 123>1.txt >2.txt
这句话,你说程序会怎么判断?
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

那就变换成这样的形式
echo 代码 >>a.txt
echo 代码 >>a.txt

或者
>b.txt echo 代码
>>b.txt echo 代码

这样和上面的形式一样,也不行吗。为什么我的顶楼的就可以,就是因为多了特殊字符码

TOP

本帖最后由 mxxcgzxxx 于 2011-4-26 14:23 编辑

14# freesoft00


无法生成 a.bat的原因与我们编程中的问题是一样的,特殊字符如">"无法使用ECHO 输出,到这就卡了,所以你的设想还要再修改!
要能给>前加^就行了

感谢13楼,方案一修改成功.
但空行无法保留,如果要保留空行,空行里用个空格就行
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

第二段生成代码。测试的文件如下:
  1. ::=====================================================
  2. :: code by freeants  CMD@XP  version:1.00
  3. ::=====================================================
  4. @echo off
  5. cd/d "%~dp0">nul
  6. if "%~z1" equ "" goto:usage
  7. if %~z1 gtr 65280 goto:NOT_SUPPORT
  8. setlocal ENABLEDELAYEDEXPANSION
  9. copy/b "%~1" $$$>nul
  10. set/a D_NUM=%~z1+255
  11. call:DEC_HEX %D_NUM% >nul
  12. echo @echo off>"%~n1.cmd"
  13. echo more +5 "%%~0"^|debug^&graftabl 936^>nul>>"%~n1.cmd"
  14. echo copy/b/y $tmp$ "%~nx1"^>nul>>"%~n1.cmd"
  15. echo del/a/f/q $tmp$>>"%~n1.cmd"
  16. echo goto:eof>>"%~n1.cmd"
  17. for /f "eol=- skip=1 tokens=*" %%i in ('^(echo d100,%FILE_SIZE%^&echo q^)^|debug $$$^&^&del $$$') do (
  18.     set op=%%i
  19.     set op=!op:-= !
  20.     echo e!op:~5,53! 2>nul>>"%~n1.cmd"
  21. )
  22. echo rcx>>"%~n1.cmd"
  23. call:DEC_HEX %~z1 >nul
  24. echo %FILE_SIZE%>>"%~n1.cmd"
  25. echo n$tmp$>>"%~n1.cmd"
  26. echo w>>"%~n1.cmd"
  27. echo q>>"%~n1.cmd"
  28. goto :EOF
  29. :DEC_HEX
  30.     set FILE_SIZE=
  31.     set PATTERN=123456789ABCDEF
  32.     set dec=%1
  33.     :WHILE
  34.     set /a res=%dec%%%16-1
  35.     set /a dec/=16
  36.     set res=!PATTERN:~%res%,1!
  37.     set FILE_SIZE=%res%%FILE_SIZE%
  38.     if "%dec%" neq "0" goto WHILE
  39. goto:eof
  40. :usage
  41.     echo.================================================
  42.     echo 你没有指定要处理的文件或指定的文件不存在……
  43.     echo.
  44.     echo 用法:
  45.     echo       %~n0 fileName
  46.     echo.================================================
  47. goto:eof
  48. :NOT_SUPPORT
  49.    echo 指定的文件过大,脚本(%~nx0)不能处理……
  50.    pause
  51. goto:eof
复制代码
转换后的文件如下;
  1. (
  2. echo   ::=====================================================
  3. echo   :: code by freeants  CMD@XP  version:1.00
  4. echo   ::=====================================================
  5. echo   @echo off
  6. echo   cd/d "%~dp0">nul
  7. echo   if "%~z1" equ "" goto:usage
  8. echo   if %~z1 gtr 65280 goto:NOT_SUPPORT
  9. echo   setlocal ENABLEDELAYEDEXPANSION
  10. echo   copy/b "%~1" $$$>nul
  11. echo   set/a D_NUM=%~z1+255
  12. echo   call:DEC_HEX %D_NUM% >nul
  13. echo   echo @echo off>"%~n1.cmd"
  14. echo   echo more +5 "%%~0"^|debug^&graftabl 936^>nul>>"%~n1.cmd"
  15. echo   echo copy/b/y $tmp$ "%~nx1"^>nul>>"%~n1.cmd"
  16. echo   echo del/a/f/q $tmp$>>"%~n1.cmd"
  17. echo   echo goto:eof>>"%~n1.cmd"
  18. echo   for /f "eol=- skip=1 tokens=*" %%i in ('^(echo d100,%FILE_SIZE%^&echo q^)^|debug $$$^&^&del $$$') do (
  19. echo       set op=%%i
  20. echo       set op=-=  
  21. echo       echo e~5,53 2>nul>>"%~n1.cmd"
  22. echo   )
  23. echo   echo rcx>>"%~n1.cmd"
  24. echo   call:DEC_HEX %~z1 >nul
  25. echo   echo %FILE_SIZE%>>"%~n1.cmd"
  26. echo   echo n$tmp$>>"%~n1.cmd"
  27. echo   echo w>>"%~n1.cmd"
  28. echo   echo q>>"%~n1.cmd"
  29. echo   goto :EOF
  30. echo   :DEC_HEX
  31. echo       set FILE_SIZE=
  32. echo       set PATTERN=123456789ABCDEF
  33. echo       set dec=%1
  34. echo       :WHILE
  35. echo       set /a res=%dec%%%16-1
  36. echo       set /a dec/=16
  37. echo       set res=~%res%,1
  38. echo       set FILE_SIZE=%res%%FILE_SIZE%
  39. echo       if "%dec%" neq "0" goto WHILE
  40. echo   goto:eof
  41. echo   :usage
  42. echo       echo.================================================
  43. echo       echo 你没有指定要处理的文件或指定的文件不存在……
  44. echo       echo.
  45. echo       echo 用法:
  46. echo       echo       %~n0 fileName
  47. echo       echo.================================================
  48. echo   goto:eof
  49. echo   :NOT_SUPPORT
  50. echo      echo 指定的文件过大,脚本(%~nx0)不能处理……
  51. echo      pause
  52. echo   goto:eof
  53. )>a.bat
复制代码
把这个2.txt改名成2.bat后运行,无法生成a.bat。
还有个小问题是原代码中的空行没有了,不过这个不是太要紧,如果可以保留更好,不好处理这样也行。

TOP

  1. @echo off
  2. (
  3. echo (
  4. for /f "delims=" %%i in (1.txt) do echo echo %%i
  5. echo ^)^>2.bat
  6. )>2.bat
  7. pause
复制代码

TOP

本帖最后由 mxxcgzxxx 于 2011-4-26 13:48 编辑

那试试第二种方案,我刚才试成功了,但后来方案一也不行了,我再查查

请高手解答下,为什么方案二可行。方案一就行不了。格式都一样的啊
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本帖最后由 freesoft00 于 2011-4-26 13:42 编辑
  1. @echo off
  2. set/p str=<%~fs0 >nul
  3. setlocal enabledelayedexpansion
  4. set "var="
  5. set "var=!var!!str:~1,1!"
  6. set "a=)"
  7. set "b=echo"
  8. set "c=("
  9. (
  10. echo %c%
  11. for /f "delims="  %%i in (1.txt) do echo %b%   %%i
  12. echo %a%!var!a.bat
  13. )>2.txt
复制代码
谢谢!我测试1.txt为测试文件,并没有2.txt输出,不行呀。

TOP

本帖最后由 mxxcgzxxx 于 2011-4-26 14:16 编辑

找了论坛半天终于解决了,自己看看改文件名,XP下测试通过
  1. :>
  2. @echo off
  3. set/p str=<%~fs0 >nul
  4. setlocal enabledelayedexpansion
  5. set "var="
  6. set "var=!var!!str:~1,1!"
  7. set "a=)"
  8. set "b=echo"
  9. set "c=("
  10. (
  11. echo %c%
  12. for /f "delims="  %%i in (1.txt) do echo %b%   %%i
  13. echo ^%a%^!var!a.bat
  14. )>2.txt
复制代码
  1. :>
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. set/p str=<%~fs0 >nul
  5. set "var="
  6. set "var=!var!!str:~1,1!"
  7. set "a=)"
  8. set "b=echo"
  9. set "c=("
  10. echo %c%>2.txt
  11. for /f "delims="  %%i in (1.txt) do echo %b%   %%i >>2.txt
  12. echo %a%!var!a.bat >>2.txt
  13. pause
复制代码
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

我用网上的reg2bat转换代码来处理bat文件,把bat文件改变成reg文件,然后通过下面的代码转换,转换后看看代码缺失,后面少了好多。这个不行。
  1. @echo off
  2. title reg文件转换成bat文件
  3. :input
  4. echo.
  5. set /p regf=请输入要转换的注册表文件名:
  6. if not exist %regf% (echo                                           ... 不存在该文件! 请重新输入 && goto input)
  7. echo %regf% | find /i ".reg" >nul
  8. if errorlevel==1 (echo                                           ... 该文件不是注册表文件! 请重新输入 && goto input)
  9. echo.
  10. echo 请稍候,正在转换 ...
  11. set regb=%regf:~0,-4%
  12. echo @echo off>%regb%.bat
  13. echo echo.>>%regb%.bat
  14. echo echo 程序运行中 ...>>%regb%.bat
  15. echo if exist %%temp%%\tmp.reg del /f /q %%temp%%\tmp.reg>>%regb%.bat
  16. for /f "tokens=*" %%a in ('type %regf%') do echo echo %%a^>^>%%temp%%\tmp.reg>>%regb%.bat
  17. echo regedit /s %%temp%%\tmp.reg>>%regb%.bat
  18. echo del /f /q %%temp%%\tmp.reg>>%regb%.bat
  19. echo                                           ... 转换完成! 按任意键退出
  20. pause>nul
复制代码

TOP

返回列表