Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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
Batch file 将命令行中从特定索引传递的所有参数引用到最终批处理脚本_Batch File_Cmd_Args - Fatal编程技术网

Batch file 将命令行中从特定索引传递的所有参数引用到最终批处理脚本

Batch file 将命令行中从特定索引传递的所有参数引用到最终批处理脚本,batch-file,cmd,args,Batch File,Cmd,Args,假设我正在将一些参数从命令行传递给批处理脚本。 比如:myfile.bat花、树、狗、美食、房子 但是参数列表的长度是动态的,而不是一直为5。 如何获取从n到最后的所有参数。 例如,如果n是2,我应该写什么才能得到doge,cate,house。 根据评论问题进行编辑。@ECHO OFF SETLOCAL 设置/a滑雪场=2 设置“destvar=somevarname” 呼叫:getargs%* 设置somevarname 设置/a滑雪场=1 设置“destvar=somevarname” 呼

假设我正在将一些参数从命令行传递给批处理脚本。 比如:
myfile.bat花、树、狗、美食、房子
但是参数列表的长度是动态的,而不是一直为5。 如何获取从n到最后的所有参数。 例如,如果n是2,我应该写什么才能得到doge,cate,house。 根据评论问题进行编辑。

@ECHO OFF
SETLOCAL
设置/a滑雪场=2
设置“destvar=somevarname”
呼叫:getargs%*
设置somevarname
设置/a滑雪场=1
设置“destvar=somevarname”
呼叫:getargs%*
设置somevarname
后藤:EOF
:getargs
如果%skippargs%gtr 0集/a skippargs-=1&shift&GOTO getargs
设置“%destvar%”
:getargsl
如果定义了%destvar%(调用集“%destvar%%=%%%destvar%%%1”
)否则(
设置“%destvar%”=%1
)
移位
如果“%~1”neq“转到getargsl
后藤:eof
这应该演示如何将第n个之后的所有参数分配给一个变量。

试试看

@echo off

set/a skip=1 & rem set skip to the number of arguments to forget
for /L %%i in (1,1,%skip%) do shift & rem skip arguments

:getArg 
echo %~1 & shift
if "%~1" neq "" goto :getArg
exit/B    

这似乎有点简单,(至少对我来说)

@Echo关闭
设置“n=2”
对于(“%*”)中的/F“令牌=%n%*”%%A,请设置“余数=%%B”
回音(剩余百分比%)
超时-1

根据需要更改第二行变量n的值

这里有一个选项,使用
进行
%*
循环(这将显示除第一个
\u NUMSKIP
参数外的所有参数):

@echo关闭
设置/A“\u NUMSKIP=2”
设置/A“索引=0”
对于%%A in(%*)do(
设置/A“索引+=1”
setlocal EnableDelayedExpansion
如果!索引!全球技术法规%\u NUMSKIP%(
端部
回声(%%A
)else endlocal
)
请注意,这对所有字符串都不安全;例如,参数
&“&”
会导致语法错误


要收集单行中的剩余参数,以便稍后传输到可执行文件,这有助于:

@echo关闭
设置/A“\u NUMSKIP=2”
设置/A“INDEX=0”和设置“ARGS=”
对于%%A in(%*)do(
设置/A“索引+=1”
设置“ARGV=%%A”
setlocal EnableDelayedExpansion
如果!索引!全球技术法规%\u NUMSKIP%(
对于/F“delims=“%%B in(^”“!ARGS!!ARGV!”^”)执行以下操作(
端部
设置“ARGS=%%~B”
)
)else endlocal
)
setlocal EnableDelayedExpansion
回声(!ARGS:~1,-1!
端部

请注意,原始的参数分隔符将被每个分隔符替换为一个空格。

真正的问题是什么?您想要最后的
n
参数,从n
n
last
一,还是什么?是的,确切地说,从n到last我担心这会错误地解析参数,因为
for/F
不处理引号
正确;此外,还有以下参数分隔符:空格、制表符、
=
和非中断空格(code
0xFF
)……别害怕……我的答案与所问的问题非常吻合,我甚至检查了预编辑的版本。它也应该与
的“flower”配合得很好,t;ree,“doge”,ca;te,ho=use
。如果我没有弄错的话,这意味着你的上述评论是完全错误的,因为它包含两个逗号。我承认,在某些情况下,我的答案不合适,但它在问题的参数范围内100%有效。你的方法解析
“flower”
作为两个单独的项目--
“flo
wer”
;但是,
cmd
视为“flo-wer”
作为引用的一个参数;这就是我所指的;当然,你的代码适用于这个问题的示例,但在现实生活中可能会失败……这解析了错误的参数,使用这个
“flower”,t;ree,“doge”,ca;te,ho=use
。它的输出是
ree“doge”可以使用
,其中每个空格表示新行。但是,我不希望所有答案都能与任何一组未知的输入参数完美配合。顺便说一句,使用n=2的其他两个答案也不能与上述输入配合使用!@Compo,这里的解析是正确的,在单独的行中,
echo
输出只是为了显示参数nts;当然,它们可以被重新收集到单个变量中,也可以在一行中输出——请参阅……虽然此代码片段可以解决问题,但确实有助于提高您文章的质量。请记住,您将为将来的读者回答此问题,而这些人可能不知道您提出代码建议的原因。请也不要用解释性的注释挤满你的代码,这会降低代码和解释的可读性!