Soru Toplu iş dosyalarında işlev / yöntem gibi bir şey var mı?


Java, C # vb. gibi bir yöntemi taklit eden bir şey var mı? Bir toplu iş dosyasında 5 komut satırı var, bu 5 satır toplu iş dosyasının içinde birden fazla yerde kullanılıyor. Bir goto kullanamam, çünkü bu 5 satırın yarattığı hata seviyesine bağlı olarak, takip eden farklı eylemlerim var. 5lines.bat bir toplu iş dosyası içinde 5 satırları koyarak çalıştı, ama orijinal toplu iş dosyası original.bat sadece 5lines.bat çağırır ve 5lines.bat çağrıdan sonra komutları yürütmez): Bu nasıl benim original.bat görünüyor sevmek:

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

5lines.bat'ta böyle bir çıkış veya benzeri bir şey yok! 5lines.bat'tan sonra hattın nasıl geçtiğinden nasıl emin olabilirim?


44
2018-04-13 22:37


Menşei




Cevaplar:


Yeniden kullanılabilir işlevlerin ayrı bir toplu iş dosyasına yerleştirilmesi, bir işlevi simüle etmek için kesinlikle çalışır.

Yakalamak için kullanmak zorunda call ikinci toplu iş dosyasının çalışmasını bitirdikten sonra denetimin arayana döndüğünden emin olmak için komut.

call 5lines.bat
echo this will now get called

19
2018-04-13 22:42





Çağrı komutunu kullanabilirsiniz:

call:myDosFunc

Ve sonra işlevi bu şekilde tanımlayın:

: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

Kaynak : Parti Fonksiyonları


65
2018-04-13 22:42



Ben de teşekkür ederim, çağrı komutu gerçekten de eksik olduğum şeydi. - stefan.at.wpf
Ama nasıl çalışır? Bu büyü nedir goto :eof ? - Calmarius
goto :eof aynıdır exit /b, her ikisi de çağrıdan sonra döner CALL - jeb
Doğru bir şekilde anlarsam, bu aynı partiyi aradığınız gibi :myDosFunc hat. - insan-e


Sadece tamlık için, parametreleri de işleve iletebilirsiniz:

İşlev çağrısı

call :myDosFunc 100 "string val"

İşlev gövdesi

:myDosFunc
echo. Got Param#1 %~1
echo. Got Param#2 %~2
goto :eof

12
2018-01-27 11:32





Çözüm:

@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

Her fonksiyonun sonunda EXIT / B'yi ve fonksiyon tanımlarının başlamasından önce, bu benim örneğimde şöyle yazılır:

EXIT / B% ERRORLEVEL%


10
2017-07-01 15:23





Listelenen örnekleri kullanmayı deneyebilirsiniz bu sayfa

Alternatif olarak, ortak satırları ana bilgisayardan aradığınız başka bir toplu iş dosyasına koyabilirsiniz.


4
2018-04-13 22:43



Harika bağlantı! (Ben sadece 5lines.bat çağrı kullanarak sona erdi) - stefan.at.wpf


Yeniden kullanılabilir toplu dosya kodu yazma konusunda başka bir harika eğitim için bkz. Richie Lawrence'ın mükemmel kütüphanesi.


1
2018-04-22 14:47





İşte sahip olmanızı sağlayacak bir 'kesmek' "anonim" işlevler toplu iş dosyalarında:

@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

Anonim fonksiyon bloğu, çağrı bildiriminin hemen arkasına yerleştirilmeli ve çıkış cümlesiyle bitmelidir.

hile budur CALL dahili kullanır GOTO ve sonra satırın bulunduğu yere geri döner CALL idam edildi. Çift genişleme GOTO yardım mesajı ile tetiklenir (ile %%/?%% argümanı) ve sonra komut dosyasını devam ettirir. Ama bittikten sonra CALL - bu yüzden if ifadesi gerekiyor.


1
2018-01-14 15:44





Diğer cevaplardan açık olup olmadığından emin değilim ama açıkçası sadece bu cevabı yayınlarım. Kodun altında yazılı olarak başka cevaplar buldum.

echo what
rem the third param gives info to which label it should comeback to
call :myDosFunc 100 "string val" ComeBack

:ComeBack
echo what what
goto :eof

:myDosFunc
echo. Got Param#1 %~1
echo. Got Param#2 %~2
set returnto=%~3
goto :%returnto%

0
2017-08-14 07:41



Neden kullanmak goto :%returnto%? goto :eof veya sadece "dosya sonu" otomatik olarak yanındaki satıra dönecektir call ... (Bu çok amacı call) ve yığında öksüz bir JumpBackAddress bırakmıyor. Çok fazla tanesi komut dosyanızı bir hata mesajı ile kıracak. - Stephan