2012-02-19 36 views
9

tôi phải viết một tập tin batch để làm một vài điềuSo sánh một ngày tập sửa đổi với ngày hiện tại trong một tập tin batch

Ban đầu tôi nghĩ vấn đề của tôi rất đơn giản - chụp ngày sửa đổi của một txt tập tin nằm trong một thư mục được chỉ định, so sánh ngày đó với ngày hiện tại và nếu chúng giống nhau làm điều gì đó. Nếu họ không làm gì khác.

Dòng tôi sử dụng để nắm bắt được ngày hiện tại là:

%date% 

Các dòng tôi sử dụng để nắm bắt những ngày sửa đổi của tập tin định của tôi là:

SET filename="C:\New Folder\New.txt" 
FOR %%f IN (%filename%) DO SET filedatetime=%%~tf 
ECHO %filedatetime:~0,-6% >> %destination% 

Trong trường hợp trên tôi m chỉ cần sử dụng echo để xem nội dung nào được trả về và có vẻ như ngày được trả về nhưng tôi có thêm thông tin:

2012/02/19 02

Tôi muốn biết cách nhận các giá trị ở trên mà chúng có thể so sánh cũng như cách so sánh chúng đúng cách.

Trả lời

9

Tôi thích dbenham's bằng cách nào, nhưng nếu bạn muốn thực hiện việc mã của bạn, bạn có thể làm như thế này:

set currentDate=%date% 
SET filename="C:\MyFile.txt" 

FOR %%f IN (%filename%) DO SET filedatetime=%%~tf 
IF %filedatetime:~0, 10% == %currentDate% goto same 

goto notsame 

:same 
echo Dates the same, do some code here 

goto next 

:notsame 
echo Dates NOT the same, do some code here 
goto end 

:next 

Nghĩ rằng nó sẽ có giá trị biết làm thế nào để làm cho bạn làm việc chỉ trong trường hợp bạn cần nó một lần nữa.

+5

Điều đó có thể không phải lúc nào cũng hoạt động - nó không trên máy tính của tôi vì% date% được bắt đầu bằng ngày trong tuần. Định dạng ngày thay đổi tùy thuộc vào ngôn ngữ, một trong những điều làm cho ngày tháng khó khăn. Nó thường dễ dàng để làm cho một cái gì đó làm việc trên một máy nhất định, nhưng một giải pháp chung thường là khó khăn. – dbenham

+0

Đủ rồi. Tôi thích câu trả lời của bạn hơn. Tốt để biết về những điều trong tuần, rất ngẫu nhiên. – SmithMart

+0

Điều này hoạt động như một sự quyến rũ. Bạn chỉ cần lưu cho tôi một ** từ bị đá :) – akhil

12

Làm việc với các ngày có nhiều khó khăn hơn trong hàng loạt thì nó nên được.

Có một lệnh có thể giúp công việc của bạn dễ dàng trong trường hợp này. FORFILES có khả năng xử lý các tệp đã được sửa đổi kể từ một ngày cụ thể. Sử dụng FORFILES /? từ dòng lệnh để nhận tài liệu về việc sử dụng nó.

lệnh đơn giản này sẽ liệt kê tất cả các file đã được sửa đổi hôm nay:

forfiles /m * /d 0 

Nếu ít nhất một tập tin được tìm thấy, sau đó ERRORLEVEL được đặt thành 0, ERRORLEVEL khác được thiết lập để 1.

Bạn có một tệp cụ thể, vì vậy bạn có thể sử dụng

forfiles /m %filename% /d 0 
if %errorlevel% == 0 (
    echo The file was modified today 
    REM do whatever else you need to do 
) else (
    echo The file has not been modified today 
    REM do whatever else you need to do 
) 

Có cách ngắn gọn hơn để thực hiện việc trên. Toán tử && được sử dụng để thực hiện điều kiện lệnh nếu lệnh trước đó thành công, || được sử dụng để thực thi điều kiện nếu lệnh trước thất bại. Tuy nhiên, hãy cẩn thận, các lệnh || cũng sẽ thực thi nếu lệnh && không thành công.

forfiles /m %filename% /d 0 && (
    echo The file was modified today 
    REM do whatever else you need to do 
) || (
    echo The file has not been modified today 
    REM do whatever else you need to do 
) 
+0

Tính năng này hoạt động tốt, nhưng có cách nào để tắt tiếng đầu ra mà nó tạo ra không? – pcnate

+0

@pcnate - Chắc chắn, chỉ cần chuyển hướng stdin và stderr đến NUL. 'forfiles/m% filename%/d 0> nul 2> nul ...' – dbenham

+0

@dbenharm Thx. Có vẻ như điều này chỉ hoạt động nếu '/ d - nn' khớp với ngày được sửa đổi. Bất kỳ cách nào có thể để khớp với bất kỳ thứ gì mới hơn '/ d - nn'? – pcnate

1

Ngoài các vấn đề được nêu trong các nhận xét được thêm vào bài viết của TechNet có tài liệu ForFiles ForFiles Documentation on Microsoft TechNet, có một vấn đề khác được đề cập, nhưng chỉ khi bạn đọc giữa các dòng liên quan đến múi giờ bị bỏ qua.Vì ForFiles đánh giá ngày Sửa đổi được báo cáo theo Giờ địa phương, nó sẽ xử lý tệp được sửa đổi tại 02:01 EST dưới dạng cũ hơn so với tệp được sửa đổi tại 02:59 EDT.

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