0

我有以下简单的批处理文件,用于重命名 *.txt 文件并删除前 x 个字符

@Echo Off

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

但是,它只处理最后一个文件?如果我有 4 个文件,最后一个文件也会被复制 4 次?

我需要做什么?

4

1 回答 1

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.


附录

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

插入符号 ( ^) “转义”后面的字符的特殊含义 - 除了%被另一个% So 转义 - 在行中

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

回显的是“Before the block”,然后是一个单曲%,文本var,另一个单曲%=the value of var

SETLOCAL ENABLEDELAYEDEXPANSION字符!变成特殊字符后。所以

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

或者

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

附加一个 single !、 string var、另一个 single!=the run-time value of var因为在 PARSE 时,^^被替换为,然后在 EXECUTION 时^将结果^!解释为文字!。在!var!PARSE 时保持不变,但被var执行时的值替换。

于 2013-04-15T10:39:48.653 回答