Есть ли способ передать процент (%) в рутину? - PullRequest
3 голосов
/ 31 января 2011

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

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

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 ]

2 голосов
/ 31 января 2011

Это специальный символ, если вы сделаете эти 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%
)
0 голосов
/ 13 июня 2011

В вашем случае проблема в 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
)
...