批处理参数:%1之后的所有内容

时间:2009-06-01 16:31:24

标签: windows parameters batch-file arguments

重复:

澄清:我知道循环方法 - 这甚至在Command Extensions之前就已经有效了;我希望得到像%〜* 1或其他任何东西一样有趣和无记录的东西 - 就像在http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true中记录的一样。


在Windows批处理文件中(所谓的“命令扩展”),%1是第一个参数,%2是第二个,等等。%*是连接的所有参数。

我的问题:例如,有没有办法让所有东西都在%2之后?

我找不到这样的东西,这对我正在做的事情会有所帮助。

7 个答案:

答案 0 :(得分:31)

使用for循环的标记化功能有一个更短的解决方案(单行):

:: all_but_first.bat
echo all: %*
for /f "tokens=1,* delims= " %%a in ("%*") do set ALL_BUT_FIRST=%%b
echo all but first: %ALL_BUT_FIRST%

输出:

> all_but_first.bat foo bar baz
all: foo bar baz
all but first: bar baz

答案 1 :(得分:19)

我不确定是否有直接命令,但您总是可以使用简单的循环并移位以将结果输入变量。类似的东西:

@echo off
set RESTVAR=
shift
:loop1
if "%1"=="" goto after_loop
set RESTVAR=%RESTVAR% %1
shift
goto loop1

:after_loop
echo %RESTVAR%

让我知道它是否有帮助!

答案 2 :(得分:6)

以下内容适用于"=' '的args(与@MaxTruxa答案相比)

echo %*
set _all=%*
call set _tail=%%_all:*%2=%%
set _tail=%2%_tail%
echo %_tail%

测试

> get_tail.cmd "first 1" --flag="other options" --verbose
"first 1" --flag="other options" --verbose
--flag="other options" --verbose

答案 3 :(得分:5)

The following will work for args with ", =, ' '. Based on Dmitry Sokolov answer. Fixed issue when second arg is the same as first arg.

<head>
  <script type="text/javascript" src="../JS Documents/bookCastingJS.js"></script>
  <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
</head>

<div class="uploadFile">
  <h2>Upload your documents...</h2>
  <p>Please ensure that you upload your require documents. Failure to do will may delay your applications.</p>
  <label for="uploadBtn" class="uploadButtonLabel calltoActionButton" id="label_span">Select file(s) to upload</label>
  <input style="width: 25%;" type="file" id="uploadBtn" name="upload" multiple="true" />
</div>
<script src="bookCastingJS.js"></script>

答案 4 :(得分:4)

您可以使用SHIFT。它删除%1并将所有其他参数更低一点。此脚本输出%2之后的所有参数(因此它输出%3,%4 ...),直到其中一个为空(所以它是最后一个):

@echo off

SHIFT
SHIFT

:loop
if "%1" == "" goto end
echo %1
SHIFT
goto loop

:end

编辑:删除使用%*的示例,因为这不起作用 - %*始终输出所有参数

答案 5 :(得分:1)

基于schnaader的答案,我认为如果你想要在%1之后连接所有内容,就会这样做。

@echo off

SHIFT

set after1=

:loop
if "%1" == "" goto end
set after1=%after1% %1
SHIFT
goto loop


:end

echo %after1%

答案 6 :(得分:1)

Sebi,这是Syntax! 有一种行为,批处理吃了等号而不用双引号引起来,这在上面的脚本中造成了麻烦。如果您不想跳过,我会根据Raman Zhylich的答案和strlen.cmd进行修改:

@ECHO OFF
SETLOCAL enableDelayedExpansion

SET _tail=%*
SET "_input="
SET /A _len=0

:again
SET "_param=%1"
SET "_input=%_input%%1"
FOR /L %%i in (0,1,8191) DO IF "!_param:~%%i,1!"=="" (
    REM skip param
    SET /A _len+=%%i
    REM _len can't be use in substring
    FOR /L %%j in (!_len!,1,!_len!) DO (
        REM skip param separator
        SET /A _len+=1
        IF "!_tail:~%%j,1!"=="=" (SET "_input=%_input%=" & SHIFT & goto :again)
    )
) & goto :next
:next
IF %_len% NEQ 0 SET _tail=!_tail:~%_len%!

ENDLOCAL & SET "_input=%_input%" & SET "_tail=%_tail%"