2011-04-10 147 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

相關問題