2011-01-31 3 views
3

дос-пакетный файлЕсть ли способ передать процент (%) в рутину?

Файл ввода имеет три записи:

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 

Символ% больше нет ! вы не знаете почему?

ответ

2

Это особый символ, если вы сделаете это 100 %%, он будет правильно выводиться как 100%. Я бы предположил, что есть способ обработать это изящно, но вам, возможно, придется поиграть с некоторыми.

EDIT: ли некоторое рытье и наткнулся на BatchSubstitute.bat http://www.dostips.com/DtCodeBatchFiles.php

адаптированный его к этому, и я думаю, что он должен работать для вас - если кто-то полностью понимает, что происходит, я хотел бы услышать О.Т. - у меня есть только vauge понятия:

@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% 
) 
0

в вашем случае проблема заключается в call :loop "%%H", вы не можете использовать call для передачи контента по значению, так как это может изменить содержание, здесь% удаляются.

Другим способом является вызов по ссылке с переменной, call :func myVar.
Но так как call действительно медленный, лучший способ - сделать материал прямо в цикле.

Другой проблемой для петель являются восклицательные знаки ! и карманы ^.
Обычно они будут уничтожены, но вы можете избежать этого с помощью отложенной техники переключения.

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 
) 
Смежные вопросы