2010-08-31 29 views
6

Tôi có một cửa sổ tập tin batch để thực hiện điều này:Làm thế nào để làm cho vòng lặp for trong cửa sổ hàng loạt tập tin chạy ở tên đơn hàng

for %%s in (*.sql) do call 

It loops through all the sql script in a folder. 

In the folder the file names are like: 
s4.06.01.sql 
s4.07.01.sql 
s4.08.01.sql 
s4.10.01.sql 
s5.01.sql 

Nhưng cho vòng lặp đi qua các tập tin một cách ngẫu nhiên (không theo thứ tự tên), nó đầu tiên chạy s5.01, sau đó s4.06, sau đó s4.08, sau đó s4.10, sau đó s4.07. Làm thế nào tôi có thể làm cho chúng chạy theo thứ tự tên?

Nó được sử dụng để hoạt động nhưng hiện tại thì không. Điều gì có thể gây ra vấn đề này?

Trả lời

3

Câu trả lời của Jerry rất có thể là nguyên nhân gây ra sự cố.

Bạn có thể giải quyết nó bằng cách thay đổi

for %%s in (*.sql) do call

để

for %%s in (dir"*.sql ^| sort) do call


Sửacudo để LonelyPixel

Giải pháp đã đăng không hoạt động như trên máy tính Windows 8 (có lẽ nó đã trở lại sau đó với Windows XP nhưng tôi không có ý tưởng).

Sau đây là giải pháp làm việc sử dụng nhắc lệnh Windows 8.

for /f "tokens=*" %%s in ('dir /b *.sql ^| sort') do echo %%s 
+2

Hoặc, 'for/f "usebackq" %% s trong (\' dir * sql/b/ON \ ') làm call' –

+0

Patrick, giải pháp của bạn cắt tất cả các tên tập tin sau khi một không gian, vì vậy nó chỉ hữu ích một phần. – ygoe

+1

Lieven, giải pháp của bạn không hoàn toàn. Nếu tôi thay thế "bởi một không gian, nó tìm thấy" dir "," | "và" sắp xếp ", quá.Vì vậy, điều đó không làm việc hoặc. – ygoe

2

Nếu bộ nhớ phân phối, bộ nhớ sẽ hoạt động trên các tệp theo thứ tự chúng được hệ thống tệp trả lại. Như vậy, nếu bạn chạy nó trên một phân vùng đĩa được định dạng bằng NTFS, tên sẽ được trả về theo thứ tự sắp xếp để chúng được xử lý theo thứ tự sắp xếp. Nếu phân hoạch đĩa được định dạng với một cái gì đó như FAT hoặc FAT32, tên sẽ được lấy ra (và xử lý) theo thứ tự nhiều hơn hoặc ít hơn ngẫu nhiên.

1

tôi cũng đã phải đối phó với không gian trong tên tập tin, vì vậy tôi thêm dấu ngoặc kép quanh biến đầu vào như sau:

for /f "tokens=*" %%s in ('dir /b *.sql ^| sort') do echo "%%s" 

Trong trường hợp của tôi đó là SQLCMD, với các kịch bản trong thư mục con, như vậy:

SET "machineName=localhost" 
for /f "tokens=*" %%f in ('dir /b PostDeployScripts\*.sql ^| sort') do sqlcmd -E -S%machineName% -i"PostDeployScripts\%%f" 
Các vấn đề liên quan