[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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有时候需要变换成上面的形式输出为新文件

本帖最后由 applba 于 2011-4-26 09:23 编辑

for /f "delims="  %%i in (1.txt) do echo %%i >>a.url
空行自己想办法弄掉……

TOP

谢谢这位朋友,但不是这个情况,你的代码是原原本本的重新变成了另一个文件,而我的要求是这样的。
比如下面的代码:命名为test.bat
  1. @echo off
  2. :: 获取当前目录名
  3. :: 当路径中含有空格、感叹号、点号、&和~的时候,也能正确提取
  4. set "cd_=%cd%"
  5. :loop
  6. set "cd_=%cd_:*\=%"
  7. set "cd_tmp=%cd_:\=%"
  8. if not "%cd_tmp%"=="%cd_%" goto loop
  9. echo "%cd_%"
  10. pause
复制代码
写一个批处理,一下就把上面的代码变成了这样的
  1. echo @echo off >test2.bat
  2. echo :: 获取当前目录名>>test2.bat
  3. echo :: 当路径中含有空格、感叹号、点号、&和~的时候,也能正确提取>>test2.bat
  4. echo set "cd_=%cd%">>test2.bat
  5. echo.>>test2.bat
  6. echo :loop>>test2.bat
  7. echo set "cd_=%cd_:*\=%">>test2.bat
  8. echo set "cd_tmp=%cd_:\=%">>test2.bat
  9. echo if not "%cd_tmp%"=="%cd_%" goto loop>>test2.bat
  10. echo echo "%cd_%">>test2.bat
  11. echo pause>>test2.bat
复制代码
或者这样的:
  1. (
  2. echo @echo off
  3. echo :: 获取当前目录名
  4. echo :: 当路径中含有空格、感叹号、点号、&和~的时候,也能正确提取
  5. echo set "cd_=%cd%"
  6. echo.
  7. echo :loop
  8. echo set "cd_=%cd_:*\=%"
  9. echo set "cd_tmp=%cd_:\=%"
  10. echo if not "%cd_tmp%"=="%cd_%" goto loop
  11. echo echo "%cd_%"
  12. echo pause
  13. )>test2.bat
复制代码
形式

TOP

  1. @echo off
  2. >b.bat echo @echo off
  3. >>b.bat echo more +3 "%%~f0"^>c.bat
  4. >>b.bat echo goto :eof
  5. >>b.bat type a.bat
复制代码

TOP

>b.bat
>>b.bat
变换成这样形式的也行,那这样的话就需要在每行前面加一个>>b.bat 加空格  ,还需要把代码中的空行加上>>b.bat echo.  最后手动改第一行的>>b.bat 改成>b.bat 就可以了。
具体的代码该如何写?

TOP

关键是">"无法输出。。其他的都做出来了?烦
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

使用第三方软件也可以,例如什么sed等。只要能达到要求,不显示非得纯批处理。

TOP

关键是">"无法输出。。其他的都做出来了?烦
世界上没有学不会的知识,也没有想得到却做不到的事!

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

本帖最后由 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

本帖最后由 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 13:48 编辑

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

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

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

第二段生成代码。测试的文件如下:
  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

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

14# freesoft00


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

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

TOP

返回列表