Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 访问批处理文件中未知数量的命令(参数)_Arrays_Batch File_Parameters_Command - Fatal编程技术网

Arrays 访问批处理文件中未知数量的命令(参数)

Arrays 访问批处理文件中未知数量的命令(参数),arrays,batch-file,parameters,command,Arrays,Batch File,Parameters,Command,这个有点难解释,但我会尽力的 我通过一个字符串数组将目录列表传递到批处理文件中,该数组是用Java创建的,然后使用Runtime.getRuntime().exec(命令)传递到.bat中。我遇到的问题是访问commands数组,数组的大小可能因执行而异。例如,在一次运行期间,“命令”可能包含以下内容: {“cmd.exe”、“/C”、“Start”、“program.bat”、“stringA”、“stringB”、“stringC”} 前四个元素用于调用批处理文件,因此只有字符串A、B和C作

这个有点难解释,但我会尽力的

我通过一个字符串数组将目录列表传递到批处理文件中,该数组是用Java创建的,然后使用Runtime.getRuntime().exec(命令)传递到.bat中。我遇到的问题是访问commands数组,数组的大小可能因执行而异。例如,在一次运行期间,“命令”可能包含以下内容:

{“cmd.exe”、“/C”、“Start”、“program.bat”、“stringA”、“stringB”、“stringC”}

前四个元素用于调用批处理文件,因此只有字符串A、B和C作为参数传递到批处理文件(program.bat)中。但是,在下一次运行时,“命令”可能如下所示:

{“cmd.exe”、“/C”、“Start”、“program.bat”、“stringA”、“stringB”、“stringC”、“stringD、stringE}

如您所见,参数列表中又添加了两个字符串。我的问题是:在批处理文件中,我有:

::Get stringA (param 1)
set stringA=%1
::Get stringB (param 2)
set stringB=%2
::Get stringC (param 3)
set stringC=%3
这将获取三个字符串参数(来自第一个“commands”数组),并将局部变量设置为传递给相应参数的任何值。我想知道是否有办法从批处理文件中确定参数的数量(例如,从第二个“命令”数组),并相应地设置/创建适当数量的局部变量。我主要关注Java,所以批处理文件对我来说还是相当新的。如果您有任何建议,我将不胜感激,因为我自己已经尝试解决了一段时间,但没有成功。

如下所述:

您可以按%1到%9进行读取,并使用SHIFT从数组中删除第一个元素,然后将它们重新汇总为新的数字

例如,%2变为%1,第10个元素变为第9个元素,您可以通过%9访问它

由于读取值变为空字符串,因此已到达数组的末尾

您可以编写一个循环(使用goto或for)来读取%1值,然后使用SHIFT将第二个元素旋转到第一个位置,并检查它是否为空,然后重复该过程。

如下所述:

@echo off
setlocal enabledelayedexpansion

set argCount=0
for %%x in (%*) do (
   set /A argCount+=1
   set "argVec[!argCount!]=%%~x"
)

echo Number of processed arguments: %argCount%

for /L %%i in (1,1,%argCount%) do echo %%i- "!argVec[%%i]!"

您可以按%1到%9进行读取,并使用SHIFT从数组中删除第一个元素,然后将它们重新汇总为新的数字

例如,%2变为%1,第10个元素变为第9个元素,您可以通过%9访问它

由于读取值变为空字符串,因此已到达数组的末尾

您可以编写一个循环(使用goto或for)来读取%1值,然后使用SHIFT将第二个元素旋转到第一个位置,并检查它是否为空,然后重复该过程

@echo off
setlocal enabledelayedexpansion

set argCount=0
for %%x in (%*) do (
   set /A argCount+=1
   set "argVec[!argCount!]=%%~x"
)

echo Number of processed arguments: %argCount%

for /L %%i in (1,1,%argCount%) do echo %%i- "!argVec[%%i]!"
例如:

C:> test One "This is | the & second one" Third
Number of processed arguments: 3
1- "One"
2- "This is | the & second one"
3- "Third"

例如:

C:> test One "This is | the & second one" Third
Number of processed arguments: 3
1- "One"
2- "This is | the & second one"
3- "Third"

您可能需要查看。您可能需要查看。我认为这正是我所需要的,这又引出了一个问题——在循环中,我必须创建一个变量并将其设置为当前值。我不确定每次循环时如何创建一个不同的、唯一的变量。欢迎使用SO。请将后续问题作为他们自己的单独问题提问。@RBerteig好的,很抱歉。我下次会记住这一点。@derstrom8当您询问后续问题时,请在原始问题或评论中添加链接,或从该问题链接回该问题。这样,你可能会从那些已经回答过这个问题的人那里得到帮助,因此总体而言,通过有清晰的问题和集中的答案,你会受益。我认为这正是我所需要的,这就引出了另一个问题——在循环中,我必须创建一个变量并将其设置为当前值。我不确定每次循环时如何创建一个不同的、唯一的变量。欢迎使用SO。请将后续问题作为他们自己的单独问题提问。@RBerteig好的,很抱歉。我下次会记住这一点。@derstrom8当您询问后续问题时,请在原始问题或评论中添加链接,或从该问题链接回该问题。这样的话,你可能会从那些已经回答过这个问题的人那里得到帮助,所以总体来说,通过有清晰的问题和集中的答案,你会受益匪浅。谢谢你,这正是我想要的。我不知道有一种方法可以在批处理文件中创建数组,但回顾过去,我发现我应该知道这是可能的。Great answer@Aacini我想让我的答案更好一些,但我正在往返家中,所以我无法改进我的答案。现在,由于没有改进它,我感到更快乐了,所以我有机会学习更多的东西,并看到很棒的、组织良好的代码。谢谢大家!@Aacini我喜欢这段代码,它允许我发送我想要的任意多个
“VALUE=KEY”
对,但我正在尝试修改它,以允许
键中有一个
*
,但没有效果。如果您有时间,我在这里发布了一个问题,或者更新此问题,我可以关闭/链接我的问题。谢谢,这正是我想要的。我不知道有一种方法可以在批处理文件中创建数组,但回顾过去,我发现我应该知道这是可能的。Great answer@Aacini我想让我的答案更好一些,但我正在往返家中,所以我无法改进我的答案。现在,由于没有改进它,我感到更快乐了,所以我有机会学习更多的东西,并看到很棒的、组织良好的代码。谢谢大家!@Aacini我喜欢这段代码,它允许我发送我想要的任意多个
“VALUE=KEY”
对,但我正在尝试修改它,以允许
键中有一个
*
,但没有效果。如果您有时间,我在这里发布了一个问题,或者更新此问题,我可以关闭/链接我的问题。