簡體   English   中英

Windows批處理文件:在for循環中設置變量

[英]windows batch files: setting variable in for loop

我有許多具有相同命名方案的文件。 作為示例,四個文件分別稱為“ num_001_001.txt”,“ num_002_001.txt”,“ num_002_002.txt”,“ num_002_003.txt”

第一組數字表示其來自哪個“包裝”,而第二組數字僅用於區分它們。 因此,在此示例中,包001中有一個文件,包002中有三個文件。

我正在編寫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放入了不同的文件,所有文件都是最后一個程序包的名稱。 我猜我在設置方法上有問題。

我有不同的解決方法來完成這項工作,但我困惑為什么這么簡單的概念行不通。

您的問題是當批處理程序在執行之前讀取for命令時,該變量將被替換。

嘗試這個:

SET temp=Hello, world!
CALL yourbatchfile.bat

您會看到Hello打印了5次。

解決的辦法是延遲擴展。 您需要先啟用它,然后再使用!temp! 代替%temp%

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

請參閱此處了解更多詳細信息。

另一種解決方案是將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 (One 2 (Two) ,缺少a ) ,要么打印2 (Two) 命令處理器將One之后的)解釋為if語句主體的末尾,將第二個echo視為在if語句之外,並忽略final )

我不確定這是否正式記錄下來,但是您可以使用call語句模擬延遲擴展:

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

將百分號加倍將變量替換推遲到第二次評估。 但是,延遲擴展要簡單得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM