2011-01-31 205 views
3

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 

OUTPUT:

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

它適應於這一點,我認爲它應該爲你工作 - 如果有人完全瞭解發生了什麼,我想OT聽到它 - 我只有一個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真的很慢,所以最好的方法是在循環中正確地做這些事情。

for-loops的另一個問題是感嘆號!和插入符號^
通常它們會被破壞,但是您可以通過延遲切換技術來避免這種情況。

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 
) 
相關問題