Batch file 有没有办法将百分比(%)传递给例程?
dos批处理文件 输入文件有三条记录:Batch file 有没有办法将百分比(%)传递给例程?,batch-file,for-loop,dos,subroutine,Batch File,For Loop,Dos,Subroutine,dos批处理文件 输入文件有三条记录: HOW NOW BROWN COW JACK AND JILL 100% JUST YOU & ME 脚本如下: @echo off set infile=e:\file.txt set outfile=e:\outfile.txt for /F "tokens=*" %%H in (%infile%) do ( call :Loop "%%H" ) exit /b 0 :Loop for %%a in (%*)
HOW NOW BROWN COW
JACK AND JILL
100% JUST YOU & ME
脚本如下:
@echo off
set infile=e:\file.txt
set outfile=e:\outfile.txt
for /F "tokens=*" %%H in (%infile%) do (
call :Loop "%%H"
)
exit /b 0
:Loop
for %%a in (%*) do echo %%~a >> %outfile%
exit /b 0
输出:
E:\>foo2
E:\>type outfile.txt
HOW NOW BROWN COW
JACK AND JILL
100 JUST YOU & ME
角色%消失了!
你知道为什么吗?这是一个特殊字符,如果你设置为100%%,它将正确输出为100%。我想有一些方法可以优雅地处理这个问题,但你可能不得不去玩一些 编辑:进行了一些挖掘,发现BatchSubstitute.bat已打开 将它改编成这样,我认为它应该对你有用——如果有人完全了解正在发生的事情,我想听听——我只有一个很好的想法:
@echo off
SETLOCAL ENABLEEXTENSIONS
SETLOCAL DISABLEDELAYEDEXPANSION
set infile=e:\file.txt
set outfile=e:\outfile.txt
for /f "tokens=1,* delims=]" %%A in ('"type %infile%|find /n /v """') do (
set "line=%%B"
if defined line (
call set "line=echo.%%line%%"
for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X >> %outfile%
) ELSE echo. >> %outfile%
)
在您的情况下,问题在于
call:loop“%%H”
,您不能使用call
按值传输内容,因为它可以更改内容,此处的%已删除
另一种方法是通过引用变量调用,call:func myVar
但是由于
call
的速度非常慢,最好的方法是在循环中正确地执行操作
for循环的另一个问题是感叹号代码>和插入符号^
通常情况下,它们会被销毁,但您可以通过延迟切换技术避免这种情况
set infile=e:\file.txt
set outfile=e:\outfile.txt
setlocal DisableDelayedExpansion
for /f "delims=" %%A in ('"findstr /n ^^ %infile%"') do (
set "line=%%A"
setlocal EnableDelayedExpansion
set "line=!line:*:=!"
(echo(!line!)>>%outfile%
rem CALL :func line
endlocal
)