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

Пакетный файл

Входной файл имеет три записи:

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%. Я полагаю, что есть способ справиться с этим изящно, но вам, возможно, придется поиграть с этим.

РЕДАКТИРОВАТЬ: сделал некоторые копания и наткнулся на BatchSubstitute.bat на http://www.dostips.com/DtCodeBatchFiles.php

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

@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 действительно медленный, лучший способ сделать вещи прямо в цикле.

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

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
)
Другие вопросы по тегам