2011-08-06 18 views
6

Giả sử tôi có một tệp lô để thực hiện một bản dựng dài và cuối cùng nó tạo ra một EXE. Nếu tôi quên đóng ứng dụng trước khi tôi bắt đầu xây dựng, giai đoạn liên kết không thành công khi không thể tạo lại EXE.Phát hiện xem tệp có đang mở trong một tệp theo lô hay không

Tôi muốn kiểm tra xem EXE có mở tại số bắt đầu của bản dựng hay không. Tôi đã thử đổi tên tệp EXE thành chính nó nhưng mặc dù điều này cho phép truy cập bị từ chối lỗi lệnh đổi tên (là lệnh nội bộ) không đặt% ErrorLevel%.

Cách thức không phá hủy để kiểm tra tệp mở có đặt% ErrorLevel% thành giá trị khác 0 không?

Trả lời

6

Phương thức đổi tên không hoạt động đối với tôi (được thử nghiệm trên Windows XP SP3). Tôi bắt đầu một ứng dụng tùy ý và cố gắng đổi tên nó thành chính nó. Không có lỗi, không ảnh hưởng gì.

Tuy nhiên, phương pháp này đã làm việc:

COPY /B app.exe+NUL app.exe 

Khi ứng dụng đang chạy, lệnh này được sản xuất cho tôi một thông báo lỗi. Và khi các ứng dụng đã được unengaged, không chỉ lệnh này bảo quản các nội dung của tập tin, nhưng nó cũng trái dấu thời gian sửa đổi không thay đổi.

Nếu tôi là bạn, do đó, tôi sẽ có thể sử dụng lệnh này (ở phần đầu của kịch bản hàng loạt, như bạn nói) theo cách này:

COPY /B app.exe+NUL app.exe >NUL || (GOTO :EOF) 

Nhà điều hành || đi sự kiểm soát để lệnh/khối bên cạnh nó nếu lệnh trước đó đã thất bại (tăng giá trị errorlevel). Do đó, lệnh trên sẽ chấm dứt tập lệnh nếu COPY không thành công (nếu tệp đó được mở).

Thông báo lỗi sẽ được giữ nguyên (vì các thông báo như vậy thường được gửi đến thiết bị lỗi chuẩn và không bị loại bỏ với chuyển hướng >NUL, trong khi các thông báo không phải lỗi khác thường được gửi đến đầu ra tiêu chuẩn. bị chặn với >NUL) và đóng vai trò như một lời giải thích về sự chấm dứt sớm của tập lệnh. Tuy nhiên, nếu bạn muốn hiển thị thông điệp của riêng bạn thay vào đó, bạn có thể thử một cái gì đó như thế này:

COPY /B app.exe+NUL app.exe >NUL 2>NUL || (ECHO Target file inaccessible& GOTO :EOF) 

Trong khi >NUL da bất cứ điều gì được gửi đến đầu ra tiêu chuẩn, 2>NUL cũng làm như vậy cho sai số chuẩn.

+0

Cảm ơn @Andriy. Vâng, nó hoạt động. Nó có thể mất một chút thời gian mặc dù, nếu các tập tin thực thi có liên quan là lớn, mà tôi đang có. Cách khác tôi nghĩ đến là viết một tiện ích 2 dòng delphi cố gắng đổi tên một tệp thành một tên ngẫu nhiên và đổi tên lại thành công nếu nó thành công và trả về một mã thoát không nếu nó không thể. – rossmcm

1
@echo off 

:start 
ren filename filename  // rename file to same name 
if errorlevel 1 goto errorline 
echo command successfull file is not in use anymore 
goto end 
:errorline 
echo Rename wasnt possible, file is in use try again in 5seconds 
timeout /T 5 
goto :start 
:end 
exit 

đổi tên tập tin để cùng tên, nếu có thể kịch bản nhảy đến kết thúc whichs thoát khỏi mã, Otherwize nó tạo code1 lỗi và nhảy đến errorline, sau một thời gian chờ 5 giây nó nhảy vào: bắt đầu nói và chữ viết bắt đầu từ lúc bắt đầu.

+0

Bất kỳ lời giải thích nào về điều này?Làm thế nào để gọi nó hoặc sử dụng nó? Bạn có thể dịch nó sang tiếng Anh được không? – Abel

1

Tìm thấy một cách tốt hơn:

:start 
timeout /T 5 

if exist %1 (
2>nul (
    >> %1 (call) 
) && (goto ende) || (goto start)) else (exit) 


:ende 
YourCode 

này sẽ kiểm tra tất cả sau 5 giây cho "là file in use" nếu nó nó nó sẽ bắt đầu lại. nếu không, nó sẽ biến thành nơi bạn có thể thực hiện các tùy chọn tiếp theo của mình