在windows批处理文件中,我知道%1
被替换为第一个参数,%2
被替换为第二个参数并且%*
被替换为所有参数。windows 7剩余的批处理文件参数
有没有办法在第一个之后得到所有参数? (例如参数2-N)第二个之后的所有论点怎么样?
SHIFT
命令似乎没有影响%*
。
在windows批处理文件中,我知道%1
被替换为第一个参数,%2
被替换为第二个参数并且%*
被替换为所有参数。windows 7剩余的批处理文件参数
有没有办法在第一个之后得到所有参数? (例如参数2-N)第二个之后的所有论点怎么样?
SHIFT
命令似乎没有影响%*
。
@ECHO OFF
SETLOCAL
CALL :allafter 3 %*
ECHO args=%args%
GOTO :eof
:allafter
FOR /l %%a IN (1,1,%1) DO SHIFT
(SET args=)
:argloop
shift
IF NOT .%1==. SET args=%args% %1&GOTO argloop
IF DEFINED args SET args=%args:~1%
GOTO :eof
拿到第三个参数后,一切ARGS
编辑 - 照顾空间分隔的元素可能包括逗号
@ECHO OFF
SETLOCAL
CALL :allafter 3 %*
ECHO args=%args%
CALL :allafter2 3 %*
ECHO args=%args%
GOTO :eof
:allafter
FOR /l %%a IN (1,1,%1) DO SHIFT
(SET args=)
:argloop
shift
IF NOT .%1==. SET args=%args% %~1&GOTO argloop
IF DEFINED args SET args=%args:~1%
GOTO :EOF
:allafter2
SET /a count=%1
SET args=%*
:arg2loop
SET oldargs=%args%
call SET args=%%args:*%1 =%%
IF "%args%"=="%oldargs%" (call SET args=%%args:*%1,=%%) ELSE (SET /a count-=1)
shift
IF %count% gtr -1 GOTO arg2loop
GOTO :EOF
Hmm-太快说话。这个修改后的例程应该会更好。在调用remove-leading-n时,以前的版本将被定义为一个参数one,two,three
的内容视为三个单独的参数。
那么,有办法十岁上下...
通过使用在shift
命令/n
开关,你可以排序的做类似的东西。但是,它会删除所有参数并将它们放入某个变量中(因此,如果没有for
循环,则不能再调用%3
)。
@setlocal enableextensions
@echo off
:loop
if "%~2" equ "" goto end
set variable=%variable% %~2
shift /2
goto loop
:end
echo %1
echo %variable%
endlocal
再度分开的参数只是做一个简单的for
循环(我敢肯定,你可以在上面找到文档的地方)。
+1,但没有理由启用延迟扩展,因为你没有使用它。 – dbenham 2013-03-15 11:18:02
@dbenham关于这个有趣的故事。我把延期扩展放在扩展中,而我花了10分钟时间试图找出为什么这个东西没有工作。我想我忘了把它拿出来。 – 2013-03-15 11:19:37
你会介意更新脚本来删除它们吗?这看起来最简单,但我不熟悉延迟扩展,所以我不知道它的含义。 – 2013-03-15 18:29:47
解决方案,而shift
& goto
:
@echo off &setlocal enabledelayedexpansion
set /a count=0
for %%i in (%*) do set /a count+=1
set "args="
for /l %%i in (2,1,%count%) do if defined args (call set "args=!args! %%%%i") else call set "args=%%%%i"
echo.%args%
endlocal
> type t.bat
@echo off
echo %*
for /f "tokens=1,*delims= " %%i in ("%*") do echo %%j
> t a b c d e f,g h i
a b c d e f,g h i
b c d e f,g h i
> t a,a b c d e f,g h i
a,a b c d e f,g h i
b c d e f,g h i
>
该死的,你得太快了。 – 2013-03-15 05:46:19
如果我用参数'a b c d e,f'调用它,那么我得到'd e f'而不是'd e,f'。有没有办法解决它,以便它允许内部参数逗号? – Museful 2014-01-05 23:57:13
@tennenrishin你需要在''quotes“'中包含一个包含逗号的参数。结果将包含仍在引号中的参数。要删除引号,请将'SET args =%args%%1'更改为'SET args =%args%%〜1' – Magoo 2014-01-06 00:17:13