
标题: [文本处理] 批处理怎样重定向输出? [打印本页]
作者: freesoft00 时间: 2011-4-26 08:56 标题: 批处理怎样重定向输出?
我知道的有两种形式
一个是- echo [InternetShortcut] >>a.url
- echo URL=c:\windows\system32\notepad.exe >>a.url
- echo IconIndex=20 >>a.url
- echo IconFile=C:\windows\system32\shell32.dll >>a.url
复制代码
一个是- (
- echo [InternetShortcut]
- echo URL=c:\windows\system32\notepad.exe
- echo IconIndex=20
- echo IconFile=C:\windows\system32\shell32.dll
- )>a.url
复制代码
代码短的话手动更改就可以,如果代码很长,每一行前面都要加echo 就很费事。
能不能写一个批处理,输入要转换为重定向输出的文本,一下就变成了上面的形式了,不用手动更改。
比如reg、bat、txt有时候需要变换成上面的形式输出为新文件
作者: applba 时间: 2011-4-26 09:19
本帖最后由 applba 于 2011-4-26 09:23 编辑
for /f "delims=" %%i in (1.txt) do echo %%i >>a.url
空行自己想办法弄掉……
作者: freesoft00 时间: 2011-4-26 11:40
谢谢这位朋友,但不是这个情况,你的代码是原原本本的重新变成了另一个文件,而我的要求是这样的。
比如下面的代码:命名为test.bat- @echo off
- :: 获取当前目录名
- :: 当路径中含有空格、感叹号、点号、&和~的时候,也能正确提取
- set "cd_=%cd%"
-
- :loop
- set "cd_=%cd_:*\=%"
- set "cd_tmp=%cd_:\=%"
- if not "%cd_tmp%"=="%cd_%" goto loop
- echo "%cd_%"
- pause
复制代码
写一个批处理,一下就把上面的代码变成了这样的- echo @echo off >test2.bat
- echo :: 获取当前目录名>>test2.bat
- echo :: 当路径中含有空格、感叹号、点号、&和~的时候,也能正确提取>>test2.bat
- echo set "cd_=%cd%">>test2.bat
- echo.>>test2.bat
- echo :loop>>test2.bat
- echo set "cd_=%cd_:*\=%">>test2.bat
- echo set "cd_tmp=%cd_:\=%">>test2.bat
- echo if not "%cd_tmp%"=="%cd_%" goto loop>>test2.bat
- echo echo "%cd_%">>test2.bat
- echo pause>>test2.bat
复制代码
或者这样的:- (
- echo @echo off
- echo :: 获取当前目录名
- echo :: 当路径中含有空格、感叹号、点号、&和~的时候,也能正确提取
- echo set "cd_=%cd%"
- echo.
- echo :loop
- echo set "cd_=%cd_:*\=%"
- echo set "cd_tmp=%cd_:\=%"
- echo if not "%cd_tmp%"=="%cd_%" goto loop
- echo echo "%cd_%"
- echo pause
- )>test2.bat
复制代码
形式
作者: Commander 时间: 2011-4-26 12:31
- @echo off
- >b.bat echo @echo off
- >>b.bat echo more +3 "%%~f0"^>c.bat
- >>b.bat echo goto :eof
- >>b.bat type a.bat
复制代码
作者: freesoft00 时间: 2011-4-26 12:53
>b.bat
>>b.bat
变换成这样形式的也行,那这样的话就需要在每行前面加一个>>b.bat 加空格 ,还需要把代码中的空行加上>>b.bat echo. 最后手动改第一行的>>b.bat 改成>b.bat 就可以了。
具体的代码该如何写?
作者: mxxcgzxxx 时间: 2011-4-26 13:01
关键是">"无法输出。。其他的都做出来了?烦
作者: freesoft00 时间: 2011-4-26 13:04
使用第三方软件也可以,例如什么sed等。只要能达到要求,不显示非得纯批处理。
作者: mxxcgzxxx 时间: 2011-4-26 13:04
关键是">"无法输出。。其他的都做出来了?烦
作者: freesoft00 时间: 2011-4-26 13:11
我用网上的reg2bat转换代码来处理bat文件,把bat文件改变成reg文件,然后通过下面的代码转换,转换后看看代码缺失,后面少了好多。这个不行。- @echo off
- title reg文件转换成bat文件
-
- :input
- echo.
- set /p regf=请输入要转换的注册表文件名:
- if not exist %regf% (echo ... 不存在该文件! 请重新输入 && goto input)
- echo %regf% | find /i ".reg" >nul
- if errorlevel==1 (echo ... 该文件不是注册表文件! 请重新输入 && goto input)
-
- echo.
- echo 请稍候,正在转换 ...
- set regb=%regf:~0,-4%
- echo @echo off>%regb%.bat
- echo echo.>>%regb%.bat
- echo echo 程序运行中 ...>>%regb%.bat
- echo if exist %%temp%%\tmp.reg del /f /q %%temp%%\tmp.reg>>%regb%.bat
- for /f "tokens=*" %%a in ('type %regf%') do echo echo %%a^>^>%%temp%%\tmp.reg>>%regb%.bat
- echo regedit /s %%temp%%\tmp.reg>>%regb%.bat
- echo del /f /q %%temp%%\tmp.reg>>%regb%.bat
- echo ... 转换完成! 按任意键退出
- pause>nul
复制代码
作者: mxxcgzxxx 时间: 2011-4-26 13:29
本帖最后由 mxxcgzxxx 于 2011-4-26 14:16 编辑
找了论坛半天终于解决了,自己看看改文件名,XP下测试通过- :>
- @echo off
- set/p str=<%~fs0 >nul
- setlocal enabledelayedexpansion
- set "var="
- set "var=!var!!str:~1,1!"
- set "a=)"
- set "b=echo"
- set "c=("
- (
- echo %c%
- for /f "delims=" %%i in (1.txt) do echo %b% %%i
- echo ^%a%^!var!a.bat
- )>2.txt
复制代码
- :>
- @echo off
- setlocal enabledelayedexpansion
- set/p str=<%~fs0 >nul
- set "var="
- set "var=!var!!str:~1,1!"
- set "a=)"
- set "b=echo"
- set "c=("
-
- echo %c%>2.txt
- for /f "delims=" %%i in (1.txt) do echo %b% %%i >>2.txt
- echo %a%!var!a.bat >>2.txt
-
- pause
复制代码
作者: freesoft00 时间: 2011-4-26 13:41
本帖最后由 freesoft00 于 2011-4-26 13:42 编辑
- @echo off
- set/p str=<%~fs0 >nul
- setlocal enabledelayedexpansion
- set "var="
- set "var=!var!!str:~1,1!"
- set "a=)"
- set "b=echo"
- set "c=("
- (
- echo %c%
- for /f "delims=" %%i in (1.txt) do echo %b% %%i
- echo %a%!var!a.bat
- )>2.txt
复制代码
谢谢!我测试1.txt为测试文件,并没有2.txt输出,不行呀。
作者: mxxcgzxxx 时间: 2011-4-26 13:46
本帖最后由 mxxcgzxxx 于 2011-4-26 13:48 编辑
那试试第二种方案,我刚才试成功了,但后来方案一也不行了,我再查查
请高手解答下,为什么方案二可行。方案一就行不了。格式都一样的啊
作者: terse 时间: 2011-4-26 13:54
- @echo off
- (
- echo (
- for /f "delims=" %%i in (1.txt) do echo echo %%i
- echo ^)^>2.bat
- )>2.bat
- pause
复制代码
作者: freesoft00 时间: 2011-4-26 13:57
第二段生成代码。测试的文件如下:- ::=====================================================
- :: code by freeants CMD@XP version:1.00
- ::=====================================================
- @echo off
- cd/d "%~dp0">nul
- if "%~z1" equ "" goto:usage
- if %~z1 gtr 65280 goto:NOT_SUPPORT
- setlocal ENABLEDELAYEDEXPANSION
- copy/b "%~1" $$$>nul
- set/a D_NUM=%~z1+255
- call:DEC_HEX %D_NUM% >nul
- echo @echo off>"%~n1.cmd"
- echo more +5 "%%~0"^|debug^&graftabl 936^>nul>>"%~n1.cmd"
- echo copy/b/y $tmp$ "%~nx1"^>nul>>"%~n1.cmd"
- echo del/a/f/q $tmp$>>"%~n1.cmd"
- echo goto:eof>>"%~n1.cmd"
- for /f "eol=- skip=1 tokens=*" %%i in ('^(echo d100,%FILE_SIZE%^&echo q^)^|debug $$$^&^&del $$$') do (
- set op=%%i
- set op=!op:-= !
- echo e!op:~5,53! 2>nul>>"%~n1.cmd"
- )
- echo rcx>>"%~n1.cmd"
- call:DEC_HEX %~z1 >nul
- echo %FILE_SIZE%>>"%~n1.cmd"
- echo n$tmp$>>"%~n1.cmd"
- echo w>>"%~n1.cmd"
- echo q>>"%~n1.cmd"
- goto :EOF
-
- :DEC_HEX
- set FILE_SIZE=
- set PATTERN=123456789ABCDEF
- set dec=%1
- :WHILE
- set /a res=%dec%%%16-1
- set /a dec/=16
- set res=!PATTERN:~%res%,1!
- set FILE_SIZE=%res%%FILE_SIZE%
- if "%dec%" neq "0" goto WHILE
- goto:eof
-
- :usage
- echo.================================================
- echo 你没有指定要处理的文件或指定的文件不存在……
- echo.
- echo 用法:
- echo %~n0 fileName
- echo.================================================
- goto:eof
-
- :NOT_SUPPORT
- echo 指定的文件过大,脚本(%~nx0)不能处理……
- pause
- goto:eof
复制代码
转换后的文件如下;- (
- echo ::=====================================================
- echo :: code by freeants CMD@XP version:1.00
- echo ::=====================================================
- echo @echo off
- echo cd/d "%~dp0">nul
- echo if "%~z1" equ "" goto:usage
- echo if %~z1 gtr 65280 goto:NOT_SUPPORT
- echo setlocal ENABLEDELAYEDEXPANSION
- echo copy/b "%~1" $$$>nul
- echo set/a D_NUM=%~z1+255
- echo call:DEC_HEX %D_NUM% >nul
- echo echo @echo off>"%~n1.cmd"
- echo echo more +5 "%%~0"^|debug^&graftabl 936^>nul>>"%~n1.cmd"
- echo echo copy/b/y $tmp$ "%~nx1"^>nul>>"%~n1.cmd"
- echo echo del/a/f/q $tmp$>>"%~n1.cmd"
- echo echo goto:eof>>"%~n1.cmd"
- echo for /f "eol=- skip=1 tokens=*" %%i in ('^(echo d100,%FILE_SIZE%^&echo q^)^|debug $$$^&^&del $$$') do (
- echo set op=%%i
- echo set op=-=
- echo echo e~5,53 2>nul>>"%~n1.cmd"
- echo )
- echo echo rcx>>"%~n1.cmd"
- echo call:DEC_HEX %~z1 >nul
- echo echo %FILE_SIZE%>>"%~n1.cmd"
- echo echo n$tmp$>>"%~n1.cmd"
- echo echo w>>"%~n1.cmd"
- echo echo q>>"%~n1.cmd"
- echo goto :EOF
- echo :DEC_HEX
- echo set FILE_SIZE=
- echo set PATTERN=123456789ABCDEF
- echo set dec=%1
- echo :WHILE
- echo set /a res=%dec%%%16-1
- echo set /a dec/=16
- echo set res=~%res%,1
- echo set FILE_SIZE=%res%%FILE_SIZE%
- echo if "%dec%" neq "0" goto WHILE
- echo goto:eof
- echo :usage
- echo echo.================================================
- echo echo 你没有指定要处理的文件或指定的文件不存在……
- echo echo.
- echo echo 用法:
- echo echo %~n0 fileName
- echo echo.================================================
- echo goto:eof
- echo :NOT_SUPPORT
- echo echo 指定的文件过大,脚本(%~nx0)不能处理……
- echo pause
- echo goto:eof
- )>a.bat
复制代码
把这个2.txt改名成2.bat后运行,无法生成a.bat。
还有个小问题是原代码中的空行没有了,不过这个不是太要紧,如果可以保留更好,不好处理这样也行。
作者: mxxcgzxxx 时间: 2011-4-26 14:11
本帖最后由 mxxcgzxxx 于 2011-4-26 14:23 编辑
14# freesoft00
无法生成 a.bat的原因与我们编程中的问题是一样的,特殊字符如">"无法使用ECHO 输出,到这就卡了,所以你的设想还要再修改!
要能给>前加^就行了
感谢13楼,方案一修改成功.
但空行无法保留,如果要保留空行,空行里用个空格就行
作者: freesoft00 时间: 2011-4-26 14:22
那就变换成这样的形式
echo 代码 >>a.txt
echo 代码 >>a.txt
或者
>b.txt echo 代码
>>b.txt echo 代码
这样和上面的形式一样,也不行吗。为什么我的顶楼的就可以,就是因为多了特殊字符码
作者: mxxcgzxxx 时间: 2011-4-26 14:25
是的,比如
echo echo 123>1.txt >2.txt
这句话,你说程序会怎么判断?
作者: freesoft00 时间: 2011-4-26 14:26
- > test.reg ECHO Windows Registry Editor Version 5.00
- >>test.reg ECHO.
- >>test.reg ECHO [HKEY_LOCAL_MACHINE\SOFTWARE]
复制代码
如果上面的不行的话,如果reg2bat转换成的bat,如果里面有特殊字符,最后用这个bat生成的reg文件也是有问题或者无法生成的吗。就是说这个转换并不是很保险是吗?
作者: freesoft00 时间: 2011-4-26 14:39
自动在>前面加一个^就可以了吧。
作者: freesoft00 时间: 2011-4-26 14:46
不行呀,第一个方案还不行,还是十四楼的测试代码,转换后的代码如下:- (
- echo ::=====================================================
- echo :: code by freeants CMD@XP version:1.00
- echo ::=====================================================
- echo @echo off
- echo cd/d "%~dp0">nul
- echo if "%~z1" equ "" goto:usage
- echo if %~z1 gtr 65280 goto:NOT_SUPPORT
- echo setlocal ENABLEDELAYEDEXPANSION
- echo copy/b "%~1" $$$>nul
- echo set/a D_NUM=%~z1+255
- echo call:DEC_HEX %D_NUM% >nul
- echo echo @echo off>"%~n1.cmd"
- echo echo more +5 "%%~0"^|debug^&graftabl 936^>nul>>"%~n1.cmd"
- echo echo copy/b/y $tmp$ "%~nx1"^>nul>>"%~n1.cmd"
- echo echo del/a/f/q $tmp$>>"%~n1.cmd"
- echo echo goto:eof>>"%~n1.cmd"
- echo for /f "eol=- skip=1 tokens=*" %%i in ('^(echo d100,%FILE_SIZE%^&echo q^)^|debug $$$^&^&del $$$') do (
- echo set op=%%i
- echo set op=-=
- echo echo e~5,53 2>nul>>"%~n1.cmd"
- echo )
- echo echo rcx>>"%~n1.cmd"
- echo call:DEC_HEX %~z1 >nul
- echo echo %FILE_SIZE%>>"%~n1.cmd"
- echo echo n$tmp$>>"%~n1.cmd"
- echo echo w>>"%~n1.cmd"
- echo echo q>>"%~n1.cmd"
- echo goto :EOF
- echo :DEC_HEX
- echo set FILE_SIZE=
- echo set PATTERN=123456789ABCDEF
- echo set dec=%1
- echo :WHILE
- echo set /a res=%dec%%%16-1
- echo set /a dec/=16
- echo set res=~%res%,1
- echo set FILE_SIZE=%res%%FILE_SIZE%
- echo if "%dec%" neq "0" goto WHILE
- echo goto:eof
- echo :usage
- echo echo.================================================
- echo echo 你没有指定要处理的文件或指定的文件不存在……
- echo echo.
- echo echo 用法:
- echo echo %~n0 fileName
- echo echo.================================================
- echo goto:eof
- echo :NOT_SUPPORT
- echo echo 指定的文件过大,脚本(%~nx0)不能处理……
- echo pause
- echo goto:eof
- )>a.bat
复制代码
运行后还是无法生成a.bat
作者: terse 时间: 2011-4-26 16:47
倒腾来 倒腾去 A.BAT 内容 还是原文件 不是吗?
作者: hanyeguxing 时间: 2011-4-26 18:22
1,如果内容中没有需要处理的变量,则直接使用 more ,优点是无敏感字符问题
2,如果文本中有需要处理的变量则使用 for /f 加 more 或 if 判断
3,如果内容只有几行,直接用 echo
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |