2013-04-15 170 views
0

我有一个重命名* .txt文件,并删除第X字符停止批处理文件只处理最后一个文件?

@Echo Off 

for %%i in ("*.txt") do (
    set fname=%%i 
    echo %fname% 
    copy %fname% %fname:~9% 
) 

但是下面这个简单的批处理文件,它只是处理的最后一个文件?如果我有4个文件,最后一个文件被复制4次?

我需要做什么?

回答

4

问题是,当首次分析循环时,%var%被替换为变量的值,并且在执行期间不会更改。

这里有一个演示应该使你可以解决您的代码:

@ECHO off&setlocal&CLS 
ECHO Demonstrating the use of %%var%% IN a block 
ECHO. 
SET var=Original value 
ECHO Before the block, %%var%%=%var% 
FOR %%i IN (1 2 3) DO (
    SET var=New value %%i 
    ECHO loop %%i : %%var%%=%var% 
) 
ECHO After the block, %%var%%=%var% 
ECHO. 
ECHO BECAUSE the block is first PARSED, then executed. 
ECHO in the parsing process, %%var%% is replaced by its 
ECHO value as it stood when the block was parsed - BEFORE execution 
ECHO. 
ECHO now try using a SETLOCAL ENABLEDELAYEDEXPANSION command first: 
ECHO. 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET var=Original value 
ECHO Before the block, %%var%%=%var% and ^^!var^^!=!var! 
FOR %%i IN (1 2 3) DO (
    SET var=New value %%i 
    ECHO loop %%i : %%var%%=%var% BUT ^^!var^^!=!var! 
) 
ECHO After the block, %%var%%=%var% and ^^!var^^!=!var! 
ECHO. 


哦,这么多的插入记号!一个不识字的兔子的天堂。

脱字符(^)“逃脱”字的特殊含义跟随 - 除了%由另一% 逃脱这样 - 行

ECHO Before the block, %%var%%=%var% 

什么是呼应是“前块“,然后单个%,文本var,另一单%=the value of var

SETLOCAL ENABLEDELAYEDEXPANSION第e字符!成为特殊字符。所以

ECHO Before the block, %%var%%=%var% and ^^!var^^!=!var! 

ECHO loop %%i : %%var%%=%var% BUT ^^!var^^!=!var! 

附加一个单一!,字符串var,另一单!=the run-time value of var因为在分析时,将^^^替换,然后将所得^!被解释在执行时间作为文字!!var!在PARSE时间保持不变,但在执行时替换为值var

+0

谢谢!尤其对于教我而不仅仅是修复。顺便说一句:克拉的^^^做什么?那是逃避'!'的方法吗? – BlueChippy

+0

你的意思是'ECHO在块之前,%% var %% =%var%和^^^!var ^^^!=!var!'?还有一个'暂停'结尾? – user2033427

+0

+1,很好的解释,我正要把'尝试使用延迟扩展',然后在我看到你的答案时使用延迟扩展的代码。 – user2033427