2012-04-13 39 views
42

có bất kỳ điều gì bắt chước một phương pháp như một người biết điều đó từ Java, C#, v.v. không? Tôi có 5 dòng lệnh trong một tập tin thực thi, 5 dòng này được sử dụng ở nhiều nơi trong tập tin thực thi. Tôi không thể sử dụng một goto, bởi vì tùy thuộc vào errorlevel tạo ra bởi những 5 dòng tôi có hành động khác nhau mà làm theo. Tôi đã thử đặt 5 dòng của tôi bên trong một tập tin batch 5lines.bat, nhưng tập tin batch ban đầu ban đầu.bat chỉ gọi 5lines.bat và không thực hiện các lệnh sau khi gọi đến 5lines.bat): Đó là cách trông ban đầu của tôi.bat như:Một cái gì đó giống như một chức năng/phương pháp trong các tập tin batch?

5lines.bat 
echo this gets never called, how to make sure this gets called? 

Không có lối ra nào hoặc cái gì như thế này trong 5lines.bat! Làm thế nào tôi có thể chắc chắn rằng các dòng sau khi 5lines.bat được gọi là?

Trả lời

16

Đặt các chức năng tái sử dụng vào một tập tin batch riêng sẽ chắc chắn làm việc để mô phỏng một hàm.

Bắt là bạn phải sử dụng lệnh call để đảm bảo rằng điều khiển trả về cho người gọi sau khi tệp lô thứ hai kết thúc thực thi.

call 5lines.bat 
echo this will now get called 
+0

Hoàn hảo, cảm ơn bạn! –

56

Bạn có thể sử dụng lệnh gọi:

call:myDosFunc 

Và sau đó xác định các chức năng theo cách này:

:myDosFunc - here starts the function 
echo. here the myDosFunc function is executing a group of commands 
echo. it could do a lot of things 
goto:eof 

Nguồn: Batch Functions

+0

Cảm ơn bạn quá, lệnh gọi là thực sự những gì tôi đã mất tích. –

+0

Không sao cả! Vui mừng nó đã làm việc ra! – Erwald

+5

Nhưng nó hoạt động như thế nào? Ma thuật trong 'goto: eof' là gì? – Calmarius

4

Bạn có thể cố gắng sử dụng các ví dụ được liệt kê trên this page

Ngoài ra, bạn có thể đặt các đường chung vào một tập tin thực thi mà bạn gọi từ chính một

+0

Liên kết tuyệt vời! (mặc dù tôi đã kết thúc chỉ đơn giản bằng cách sử dụng cuộc gọi 5lines.bat) –

1

Đối với một hướng dẫn tuyệt vời về kỹ năng viết mã tệp hàng loạt có thể tái sử dụng - xem Richie Lawrence's excellent library.

+0

Các liên kết hiện đã chết. – TLS

+0

@TLS, cảm ơn, đã cập nhật liên kết – jwfearn

7

Giải pháp:

@ECHO OFF  

call:header Start Some Operation 

... put your business logic here 
... make sure EXIT below is present 
... so you don't run into actual functions without the call 

call:header Operation Finished Successfully 

EXIT /B %ERRORLEVEL% 

:: Functions 

:header 
ECHO ================================================= 
ECHO %* 
ECHO ================================================= 
EXIT /B 0 

quan trọng cần đặt EXIT/B ở phần cuối của mỗi chức năng, cũng như trước khi định nghĩa chức năng bắt đầu, trong ví dụ của tôi đây là:

EXIT/B % ERRORLEVEL%

1

Đây là 'hack' cho phép bạn có "anonymous" functions trong các tệp hàng loạt:

@echo off 
setlocal 
set "anonymous=/?" 

:: calling the anonymous function 
call :%%anonymous%% a b c 3>&1 >nul 

:: here the anonymous function is defined 
if "%0" == ":%anonymous%" (
    echo(
    echo Anonymous call: 
    echo %%1=%1 %%2=%2 %%3=%3 
    exit /b 0 
)>&3 
::end of the anonymous function 

Các khối chức năng ẩn danh nên được đặt ngay sau khi tuyên bố cuộc gọi và phải kết thúc với tuyên bố thoát

lừa là CALL nội bộ sử dụng GOTO và sau đó quay trở lại dòng nơi CALL được thực thi. Với thông báo trợ giúp GOTO mở rộng kép được kích hoạt (với đối số %%/?%%) và sau đó tiếp tục tập lệnh. Nhưng sau khi nó kết thúc, nó quay trở lại CALL - đó là lý do tại sao câu lệnh if là cần thiết.

3

Chỉ cần cho đầy đủ, bạn cũng có thể vượt qua tham số cho hàm:

Chức năng gọi

call :myDosFunc 100 "string val" 

Chức năng cơ thể

:myDosFunc 
echo. Got Param#1 %~1 
echo. Got Param#2 %~2 
goto :eof 
Các vấn đề liên quan