Есть ли способ передать процент (%) в рутину?
Пакетный файл
Входной файл имеет три записи:
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
)