Something like a function/method in batch files?

后端 未结 9 408
忘了有多久
忘了有多久 2020-12-08 00:05

is there anything that mimicks a method like one knows it from Java, C# etc.? I have 5 lines of commands in a batch file, those 5 lines are used at more than one place insid

相关标签:
9条回答
  • 2020-12-08 00:36

    Here's a 'hack' that will allow you to have "anonymous" functions in batch files:

    @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
    

    The anonymous function block should be placed right after the call statement and must end with exit statement

    the trick is that CALL internally uses GOTO and then returns to the line where the CALL was executed. With the double expansion GOTO help message is triggered (with %%/?%% argument) and then continues the script. But after it is finished it returns to the CALL - that's why the if statement is needed.

    0 讨论(0)
  • 2020-12-08 00:47

    Coming from a Java background, I have tried to incorporate some familiar conventions when creating procedures for .bat scripts.

    The script below demonstrates the definition of two procedures.

    @ECHO OFF
    SET firstInstanceVariable="Hello world!"
    SET secondInstanceVariable="Good bye world!"
    GOTO:MAIN
    
    :firstMethodName
        SETLOCAL ENABLEDELAYEDEXPANSION
            SET firstArgumentPassedIn=%~1
            SET secondArgumentPassedIn=%~2
            
            ECHO %firstInstanceVariable%
            ECHO "The first argument passed in was %firstArgumentPassedIn%"
            ECHO "The second argument passed in was %secondArgumentPassedIn%"
        ENDLOCAL
    EXIT /B 0
    
    :secondMethodName
        SETLOCAL ENABLEDELAYEDEXPANSION
            SET firstArgumentPassedIn=%~1
            SET secondArgumentPassedIn=%~2
            
            ECHO %secondInstanceVariable%
            ECHO "The first argument passed in was %firstArgumentPassedIn%"
            ECHO "The second argument passed in was %secondArgumentPassedIn%"
        ENDLOCAL
    EXIT /B 0
    
    
    :MAIN
    call:firstMethodName "The Quick Brown" "Fox Jumps Over"
    call:secondMethodName "1 2 3 4" 3.14
    

    Notice that an explicit GOTO:MAIN is necessary to skip over the procedure definitions. This is because you must skip over the procedure before deciding to read it. Otherwise, the procedure will be executed.

    The code below demonstrates a close Java-equivalent of the above .bat script.

    public class MyObject {
        private String firstInstanceVariable = "Hello world!";
        private String secondInstanceVariable = "Good bye world!";
        public void firstMethodName(Object... arguments) {
            String firstArgumentPassedIn = arguments[0].toString();
            String secondArgumentPassedIn = arguments[1].toString();
            System.out.println(firstInstanceVariable);
            System.out.format("The first argument passed in was %s", firstArgumentPassedIn);
            System.out.format("The second argument passed in was %s", secondArgumentPassedIn);
        }
    
        public void secondMethodName(Object... arguments) {
            String firstArgumentPassedIn = arguments[0].toString();
            String secondArgumentPassedIn = arguments[1].toString();
            System.out.println(secondInstanceVariable);
            System.out.format("The first argument passed in was %s", firstArgumentPassedIn);
            System.out.format("The second argument passed in was %s", secondArgumentPassedIn);
        }
    
        public static void main(String[] args) {
            MyObject myObject = new MyObject();
            myObject.firstMethodName("The Quick Brown", "Fox Jumps Over");
            myObject.secondMethodName(new Integer[]{1,2,3,4}, 3.14);
        }
    }
    
    0 讨论(0)
  • 2020-12-08 00:48

    You could try to use the examples listed on this page

    Alternatively, you could put the common lines into another batch file that you call from the main one

    0 讨论(0)
提交回复
热议问题