2013-03-15 92 views
1

在windows批处理文件中,我知道%1被替换为第一个参数,%2被替换为第二个参数并且%*被替换为所有参数。windows 7剩余的批处理文件参数

有没有办法在第一个之后得到所有参数? (例如参数2-N)第二个之后的所有论点怎么样?

SHIFT命令似乎没有影响%*

回答

5
@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的内容视为三个单独的参数。

+0

该死的,你得太快了。 – 2013-03-15 05:46:19

+0

如果我用参数'a b c d e,f'调用它,那么我得到'd e f'而不是'd e,f'。有没有办法解决它,以便它允许内部参数逗号? – Museful 2014-01-05 23:57:13

+1

@tennenrishin你需要在''quotes“'中包含一个包含逗号的参数。结果将包含仍在引号中的参数。要删除引号,请将'SET args =%args%%1'更改为'SET args =%args%%〜1' – Magoo 2014-01-06 00:17:13

3

那么,有办法十岁上下...

通过使用在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循环(我敢肯定,你可以在上面找到文档的地方)。

+0

+1,但没有理由启用延迟扩展,因为你没有使用它。 – dbenham 2013-03-15 11:18:02

+0

@dbenham关于这个有趣的故事。我把延期扩展放在扩展中,而我花了10分钟时间试图找出为什么这个东西没有工作。我想我忘了把它拿出来。 – 2013-03-15 11:19:37

+0

你会介意更新脚本来删除它们吗?这看起来最简单,但我不熟悉延迟扩展,所以我不知道它的含义。 – 2013-03-15 18:29:47

1

解决方案,而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 
+1

不,你不能在不使用SHIFT的情况下访问大于'%9'的参数,(除非你使用'%*'并编写你自己的arg解析器) – dbenham 2013-03-15 11:15:42

+0

是的,你是对的。 – Endoro 2013-03-15 11:38:12

+0

即使在dbenham所说的+1之后,努力。 – 2013-03-16 07:04:24

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

>