windows - batch parametre: alt efter\% 1

Indlæg af Hanne Mølgaard Plasc

Problem



Duplicate:



  • Er der mulighed for at angive de sidste n-parametre i en batchfil?

  • Hvordan får du batchfilparametre fra Nth-position på?



Præcisering: Jeg vidste om looping-tilgangen - det fungerede lige før kommandoudvidelser; Jeg håbede på noget sjovt og undokumenteret som\% ~ * 1 eller hvad som helst - ligesom de dokumenterede på http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx ? mfr=true. [16]





I en Windows-batchfil (med de såkaldte 'Command Extensions' på) er\% 1 det første argument,\% 2 er det andet osv.\% * Er alle argumenter sammenkædede.


Mit spørgsmål: er der en måde at få alt efter\% 2, for eksempel?


Jeg kunne ikke finde sådan en ting, og det ville være nyttigt for noget jeg arbejder på.

Bedste reference


Jeg er ikke sikker på, om der er en direkte kommando, men du kan altid bruge en simpel loop og skifte for at få resultatet i en variabel. Noget som:


@echo off
set RESTVAR=
shift
:loop1
if "\%1"=="" goto after\_loop
set RESTVAR=\%RESTVAR\% \%1
shift
goto loop1

:after\_loop
echo \%RESTVAR\%



Lad mig vide, om det hjælper!

Andre referencer 1


Der er en kortere løsning (one-liner) ved hjælp af tokeniseringsfunktionerne for for sløjfer:


:: 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\%


produktion:


> all\_but\_first.bat foo bar baz
all: foo bar baz
all but first: bar baz

Andre referencer 2


Du kan bruge SHIFT til dette. Det fjerner\% 1 og skifter alle andre argumenter en lavere. Dette script output alle argumenterne efter\% 2 (så det udsender\% 3,\% 4 ...), indtil en af ​​dem er tom (så den er den sidste):


@echo off

SHIFT
SHIFT

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

:end


EDIT: Fjernet eksempel ved hjælp af\% * da dette ikke virker -\% * udsender altid alle parametrene

Andre referencer 3


Følgende vil fungere for args med ", =, ' ' (sammenlignet med @MaxTruxa svar)


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


Prøve


> get\_tail.cmd "first 1" --flag="other options" --verbose
"first 1" --flag="other options" --verbose
--flag="other options" --verbose

Andre referencer 4


Følgende vil arbejde for args med ', =' '. Baseret på Dmitry Sokolov svar. Fast problem, når anden arg er det samme som første arg.


@echo off
echo \%*
set \_tail=\%*
call set \_tail=\%\%\_tail:*\%1=\%\%
echo \%\_tail\%

Andre referencer 5


Baseret på Schnaader's svar tror jeg det gør det, hvis du vil have alt efter\% 1 sammenkædet.


@echo off

SHIFT

set after1=

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


:end

echo \%after1\%

Andre referencer 6


Sebi, her er syntaxen!
Der er en adfærd, parti spiser de samme tegn, som ikke er dobbelt citeret, det forårsager problemer i scriptsne ovenfor. Hvis du ikke vil springe, har jeg lavet en ændring, baseret på Raman Zhylich svar og strlen.cmd: [17]


@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\%"