2010-10-21 28 views
6

cố gắng tạo tập lệnh .bat và cần phải thực hiện một số chuỗi hoạt động đúng cách.Cmd: không đánh giá các biến bên trong một vòng lặp

Đây là những gì tôi đã có cho đến nay

@echo off 
for /r %%i in (*.csv) do (
set str=%%i 
set str=%str:csv=rar% 
echo %%i 
echo.%str% 
) 

Nói rằng tôi đã có chạy này trong C: \, và có 5 csv, 1.csv, 2.csv ... 5.csv

lần đầu tiên tôi chạy nó, tôi nhận được đầu ra của:

C:\1.csv 

C:\2.csv 

C:\3.csv 

C:\4.csv 

C:\5.csv 

lần thứ hai tôi nhận được:

C:\1.csv 
csv=rar 
C:\2.csv 
csv=rar 
C:\3.csv 
csv=rar 
C:\4.csv 
csv=rar 
C:\5.csv 

Sau đó, tất cả các cuộc gọi tiếp theo tôi nhận được:

C:\1.csv 
rar=rar 
C:\2.csv 
rar=rar 
C:\3.csv 
rar=rar 
C:\4.csv 
rar=rar 
C:\5.csv 

Khi những gì tôi sẽ mong đợi để nhận được là thẳng qua:

C:\1.csv 
C:\1.rar 
C:\2.csv 
C:\2.rar 
C:\3.csv 
C:\3.rar 
C:\4.csv 
C:\4.rar 
C:\5.csv 
C:\5.rar 

Vì vậy, tôi loại bỏ các thay:

@echo off 
for /r %%i in (*.csv) do (
echo %%i 
set str=%%i 
echo.%str% 
) 

chạy đầu tiên :

C:\1.csv 

C:\2.csv 

C:\3.csv 

C:\4.csv 

C:\5.csv 

Second Run:

C:\1.csv 
C:\5.csv 
C:\2.csv 
C:\5.csv 
C:\3.csv 
C:\5.csv 
C:\4.csv 
C:\5.csv 
C:\5.csv 
C:\5.csv 

Nó giống như nó không đặt biến str cho đến khi thời gian cuối cùng của vòng lặp, mặc dù nó cố gắng để echo ra biến, dòng trong đó xảy ra sau khi cài đặt, và sau đó lưu này cho vòng lặp tiếp theo? Có cái gì tôi đang thiếu trên cách nó processess vòng?

Cảm ơn

Trả lời

9

Bạn nên sử dụng setlocal enabledelayedexpansion. Trên thực tế, nội dung của %str:csv=rar% chỉ được đánh giá một lần trước khi vòng lặp chạy. Vì vậy:

@echo off 
setlocal enabledelayedexpansion 
for /r %%I in (*.csv) do (
set str=%%i 
set str=!str:csv=rar! 
echo %%i 
echo.!str! 
) 
endlocal 
+0

Bạn thưa bạn, là một quý ông! (Sẽ chấp nhận trong 5 phút khi tôi có thể) – Psytronic

+0

Đó là một vấn đề phổ biến với các tập tin batch ... Tôi đã bị lừa bởi một số tháng trước… – Benoit

Các vấn đề liên quan