Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 有没有办法将百分比(%)传递给例程?_Batch File_For Loop_Dos_Subroutine - Fatal编程技术网

Batch file 有没有办法将百分比(%)传递给例程?

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 (%*)

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 (%*) 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
)