批量循环数组

时间:2019-02-06 14:02:53

标签: batch-file

我有一段代码可以从数组中循环,但是最终 goto在这个时候出乎意料。怎么了?

@echo off 
set len = 3 
set obj[0].Name = Joe 
set obj[0].ID = 1 
set obj[1].Name = Mark 
set obj[1].ID = 2 
set obj[2].Name = Mohan 
set obj[2].ID = 3 
set i = 0 
:loop 

if %i% equ %len% goto :eof 
set cur.Name= 
set cur.ID=

for /f "usebackq delims==.tokens=1-3" %%j in (`set obj[%i%]`) do ( 
   set cur.%%k=%%l 
) 
echo Name = %cur.Name% 
echo Value = %cur.ID% 
set /a i = %i%+1 
goto loop

按如下所示删除这些空间后:

@echo off 
set len=3 
set obj[0].Name=Joe 
set obj[0].ID=1 
set obj[1].Name=Mark 
set obj[1].ID=2 
set obj[2].Name=Mohan 
set obj[2].ID=3 
set i=0 
:loop 

if %i% equ %len% goto :eof 
set cur.Name=
set cur.ID=

for /f "usebackq delims==.tokens=1-3" %%j in (`set obj[%i%]`) do ( 
   set cur.%%k=%%l 
) 
echo Name=%cur.Name% 
echo Value=%cur.ID% 
set /a i=%i%+1 
goto loop

我得到了这些结果

  • 名称=
  • Value =
  • 名称=
  • Value =
  • 名称=
  • Value =

???

使用obj [%i%]之后,以下代码:

@echo off 
set len=3
set obj[0].Name=Joe
set obj[0].ID=1
set obj[1].Name=Mark
set obj[1].ID=2
set obj[2].Name=Mohan
set obj[2].ID=3
set i=0
:loop 

if %i% equ %len% goto :eof 
set cur.Name=%obj[%i%].Name%
set cur.ID=%obj[%i%].ID%

for /f "usebackq delims==.tokens=1-3" %%j in (`set obj[%i%]`) do ( 
   set cur.%%k=%%l 
) 
echo Name=%cur.Name% 
echo Value=%cur.ID% 
set /a i=%i%+1 
goto loop

得到以下结果

  • Name = i
  • Value = i
  • Name = i
  • Value = i
  • Name = i
  • Value = i

2 个答案:

答案 0 :(得分:0)

我删除了“ set”等号周围的空格:

@echo off 
set /a len=3 

set obj[0].Name=Joe 
set obj[0].ID=1 
set obj[1].Name=Mark 
set obj[1].ID=2 
set obj[2].Name=Mohan 
set obj[2].ID=3 

set /a i=0 

:loop 
    if "%i%" equ "%len%" goto :eof 
    set cur.Name=
    set cur.ID=

    for /f "usebackq delims==. tokens=1-3" %%j in (`set obj[%i%]`) do ( 
       set cur.%%k=%%l 
    ) 
    echo Name=%cur.Name% 
    echo Value=%cur.ID% 
    set /a i=%i%+1 
goto loop
:eof

输出看起来像:

Name=Joe
Value=1
Name=Mark
Value=2
Name=Mohan
Value=3

答案 1 :(得分:0)

我个人建议使用以下更简单的代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;
import javax.jms.ConnectionFactory;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.JMSProducer;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class Main implements MessageListener{


public static void main(String[] args) throws JMSException,NamingException, IOException{

    if(args.length!=3) System.out.println("usage: username subscribe-to-queue publish-to-queue");
    else {
        String username = args[0];
        System.out.println("username: " + username + " | subscribe-to-queue-name " + args[1] + " | publish-to-queue-name " + args[2]);
        Context initialContext = Main.getInitialContext();
        Main myMain = new Main();
        System.out.println("Before Queue");
        Queue queue01 = (Queue) initialContext.lookup(args[1]);
        Queue queue02 = (Queue) initialContext.lookup(args[2]);
        //java:comp/DefaultJMSConnectionFactory is the default conection at the JMS app server (no need to define it)
        System.out.println("Before ConnectionFactory");
        JMSContext jmsContext = ((ConnectionFactory) initialContext.lookup("java:comp/DefaultJMSConnectionFactory")).createContext();
        //we use jms context to pickup jms consumer and assign it our own class (Main)
        System.out.println("Before createConsumer");
        jmsContext.createConsumer(queue01).setMessageListener(myMain);
        System.out.println("Before jmsProducer");
        JMSProducer jmsProducer = jmsContext.createProducer();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String msgToSend = null;

        System.out.println("Before while");
        while(true) {
            System.out.println("Please enter msg:");
            msgToSend = bufferedReader.readLine();
            if(msgToSend.equalsIgnoreCase("exit")) {
                jmsContext.close();
                System.exit(0);
            }else {
                System.out.println("Before send");
                jmsProducer.send(queue02, "["+username+": "+msgToSend+"]");
                System.out.println("after send");
            }
        }
    }
}

@Override
public void onMessage(Message message) {
    try{System.out.println(message.getBody(String.class));}
    catch (JMSException e) {e.printStackTrace();}
}

public static Context getInitialContext () throws JMSException,NamingException
{
     Properties prop = new Properties();
     prop.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
     prop.setProperty("java.naming.factory.url.pkgs", "org.jnp.interfaces");
     prop.setProperty("java.naming.provider.url", "jnp://localhost:3700");
     Context context = new InitialContext(prop);


    //Context context = new InitialContext();

return context;
}

}

这样输出将是:

@echo off 
setlocal EnableDelayedExpansion

set "obj[0].Name=Joe"
set "obj[0].ID=1"
set "obj[1].Name=Mark"
set "obj[1].ID=2"
set "obj[2].Name=Mohan"
set "obj[2].ID=3"

:loop
for /L %%A IN (0 1 2) do (
    for /F "delims=. tokens=2" %%B in ('set obj[%%A] ^| sort /R') do (
        set "output=%%B"
        echo !output:ID=Value!
    )
)