重复:
澄清:我知道循环方法 - 这甚至在Command Extensions之前就已经有效了;我希望得到像%〜* 1或其他任何东西一样有趣和无记录的东西 - 就像在http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true中记录的一样。
在Windows批处理文件中(所谓的“命令扩展”),%1是第一个参数,%2是第二个,等等。%*是连接的所有参数。
我的问题:例如,有没有办法让所有东西都在%2之后?
我找不到这样的东西,这对我正在做的事情会有所帮助。
答案 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%"