2016-12-07 107 views
2

假设我将一些参数从命令行传递到批处理脚本。 赞:myfile.bat flower, tree, doge, cate, house 但参数列表的长度是动态的,而不是所有的时间。 我怎样才能从n到所有参数。 例如,如果n是2,我应该写些什么来获得doge,cate,house。 根据评论问题编辑。将从命令行传递的所有参数从特定索引传递到最终批处理脚本

+0

什么是真正的问题?你想要最后一个'n'的参数,从'n'到'最后一个',还是什么? – elzooilogico

+0

是的,从n到最后 – TBogdan

回答

1
@ECHO OFF 
SETLOCAL 
SET /a skipargs=2 
SET "destvar=somevarname" 

CALL :getargs %* 

SET somevarname 

SET /a skipargs=1 
SET "destvar=somevarname" 

CALL :getargs %* 

SET somevarname 


GOTO :EOF 

:getargs 
IF %skipargs% gtr 0 SET /a skipargs-=1&shift&GOTO getargs 
SET "%destvar%=" 
:getargsl 
IF DEFINED %destvar% (CALL SET "%destvar%=%%%destvar%%% %1" 
) ELSE (
SET "%destvar%=%1" 
) 
SHIFT 
IF "%~1" neq "" GOTO getargsl 
GOTO :eof 

这应该说明如何所有ARGS第n给一个变量后分配

0

尝试

@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  
+0

尽管这段代码可以解决这个问题,但[包括解释](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高您的帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来挤占代码,这会降低代码和解释的可读性! – kayess

-2

这似乎稍微简单一些,(至少对我来说)

@Echo Off 
Set "n=2" 
For /F "Tokens=%n%*" %%A In ("%*") Do Set "remainder=%%B" 
Echo(%remainder% 
Timeout -1 

变化变量n的两个行上的值按需要

+1

恐怕这是错误地解析参数,因为for/F不能正确处理引用'“”';此外,还有以下参数分隔符:*空格*,* tab *,',',';','='和*非空格*(代码0xFF)... – aschipfl

+0

不要害怕......我的答案完全符合所问的问题,我甚至检查过预编辑的版本。它也应该与'花',t; ree,'doge',ca; te,ho = use'完美配合。如果我没有弄错,这意味着你的上面的评论是完全错误的,因为它包含了一个逗号。我接受有些情况下我的答案不适合,但它在问题的参数范围内100%有效。 – Compo

+1

你的方法将'floer'解析为两个单独的项目 - ''flo'和'wer'';然而,由于引用,'cmd'将'flo'视为一个参数;这就是我所指的;当然你的代码适用于这个问题的例子,但它可能会在真实情况下失败...... – aschipfl

0

下面是一个使用for遍历%*一个选项(这将显示所有,但第一_NUMSKIP参数):

@echo off 
set /A "_NUMSKIP=2" 
set /A "INDEX=0" 
for %%A in (%*) do (
    set /A "INDEX+=1" 
    setlocal EnableDelayedExpansion 
    if !INDEX! GTR %_NUMSKIP% (
     endlocal 
     echo(%%A 
    ) else endlocal 
) 

请注意,这不是对所有字符串安全的;例如,自变量&"&"会导致语法错误!


收集在一个单行其余的参数供以后转移到可执行文件,这会有所帮助:

@echo off 
set /A "_NUMSKIP=2" 
set /A "INDEX=0" & set "ARGS= " 
for %%A in (%*) do (
    set /A "INDEX+=1" 
    set "ARGV=%%A" 
    setlocal EnableDelayedExpansion 
    if !INDEX! GTR %_NUMSKIP% (
     for /F "delims=" %%B in (^""!ARGS!!ARGV!"^") do (
      endlocal 
      set "ARGS=%%~B " 
     ) 
    ) else endlocal 
) 
setlocal EnableDelayedExpansion 
echo(!ARGS:~1,-1! 
endlocal 

需要注意的是原始的参数分隔符替换成为由单一的SPACE每个。

+0

这错误地解析了参数,使用这个''花',t; ree,“doge”,ca; te,ho = use'来看看。它的输出是'ree' doge“ca te ho use',其中每个空格表示一个新行。然而,我并不期望所有答案都能与任何一组未知输入参数完美配合。顺便说一句,使用n = 2的另外两个答案也不适用于上面的输入! – Compo

+0

@Compo,这里的解析是正确的,在单独行中的'echo'输出只是显示参数;当然,他们可以重新收集到一个单一的变量或输出在一个单一的行 - 见[编辑答案](http://stackoverflow.com/revisions/41018823/2)... – aschipfl

+0

感谢(不合理)下来-投票... – aschipfl

相关问题