2011-04-10 159 views
22

我有许多具有相同命名方案的文件。作为示例,四个文件被称为“num_001_001.txt”,“num_002_001.txt”,“num_002_002.txt”,“num_002_003.txt”windows批处理文件:for循环中的设置变量

第一组数字表示来自哪个“包”第二组数字仅用于区分它们。所以在这个例子中,我们在包001中有一个文件,在包00中有三个文件。

我正在编写一个windows vista批处理命令来获取所有文件并将它们移动到它们自己的目录中,其中每个目录代表不同的包。所以我想将包001的所有文件移动到目录“001”,并将002的所有文件移动到目录“002”中

我已经成功编写了一个脚本,它将迭代所有txt文件并对其进行回显。我还写了一个脚本,将一个文件移动到另一个位置,并创建该目录(如果该目录不存在)。

现在我认为我需要使用子字符串,所以我使用%var:〜start,end%语法来获取它们。作为测试,我写了这个验证我其实可以提取串并创建一个目录有条件

 
@echo off 
set temp=num_001_001.txt 
NOT IF exist %temp:~0,7%\ 
    mkdir %temp:~0,7% 

和它的作品。大。
然后我添加了for循环。

@echo off 
FOR /R %%X IN (*.txt) DO (
    set temp=%%~nX 
    echo directory %temp:~0,7% 
) 

但是,这是我的输出:

 
directory num_002 
directory num_002 
directory num_002 
directory num_002 

有什么不对? vista是否不支持在每次迭代中重新分配变量? 这四个文件位于我的目录中,其中一个应创建num_001。我把003 004 005放在不同的文件中,全部都是最后一个包的名字。我猜测我的设置方式有问题。

我有不同的解决方法来完成工作,但我很困惑为什么这样一个简单的概念不会工作。

+1

可能重复的[在for循环中初始化批处理文件变量](https://stackoverflow.com/questions/691047/batch-file-variables-initialized-in-a-for-loop) – 2017-11-09 12:16:01

回答

42

你的问题是,当批处理程序在执行前读取for命令时,变量被替换。

试试这个:

SET temp=Hello, world! 
CALL yourbatchfile.bat 

,你会看到你好印刷5次。

解决方案是延迟扩展;您需要先启用它,然后用!temp!代替%temp%

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /R %%X IN (*.txt) DO (
    set temp=%%~nX 
    echo directory !temp:~0,7! 
) 

详情请参阅here

+1

学到了新的东西。非常感谢。 – MxyL 2011-04-10 23:36:09

+1

终于在浪费了几个小时后才发现它。感谢分享。 – Riz 2016-12-28 07:47:54

14

另一种解决方案是将for循环的主体移动到子程序和call它。

@echo off 
FOR /R %%X IN (*.txt) DO call :body %%X 
goto :eof 

:body 
set temp=%~n1 
echo directory %temp:~0,7% 
goto :eof 

为什么这样做?其中一个原因是Windows命令处理器对括号很贪婪,结果可能令人惊讶。当解引用包含C:\Program Files (x86)的变量时,我通常会遇到这个问题。

如果Windows命令处理器是贪心不足,下面的代码要么打印One (1)Two (2)或者什么都没有:

@echo off 
if "%1" == "yes" (
    echo 1 (One) 
    echo 2 (Two) 
) 

然而,这不是它做什么。要么打印1 (One2 (Two),其中缺少),或打印2 (Two)。命令处理器将One之后的)解释为if语句正文的结尾,将第二个echo视为在if语句之外,并忽略最终的)

+1

这很有趣。很高兴知道! – MxyL 2011-04-11 14:02:38

4

我不知道这是否是正式文件,但你可以使用call声明模拟延迟扩展:

@echo off 
FOR /R %%X IN (*.txt) DO (
    set temp=%%~nX 
    call echo directory %%temp:~0,7%% 
) 

加倍百分号推迟变量替换,以第二次评估。但是,延期扩张更直接。

+0

问题是您没有将实际值分配给温度。即temp仍然包含“%%〜nX” – 2017-01-25 10:42:06

相关问题