batch parametere: alt etter% 1

stemmer
26

Duplisere:

Avklaring: Jeg visste av looping tilnærming - dette arbeidet selv før kommandoutvidelser; Jeg hadde håpet på noe morsomt og udokumentert som% ~ * 1 eller hva - akkurat som de dokumentert ved http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx ? prod = true .


I en Windows batch-fil (med de såkalte Command Extensions på),% 1 er det første argumentet,% 2 er den andre, osv% * er alle argumenter sammensatt.

Mitt spørsmål: er det en måte å få alt ETTER% 2, for eksempel?

Jeg kunne ikke finne noe slikt, og det ville være nyttig for noe jeg jobber med.

Publisert på 01/06/2009 klokken 16:31
kilden bruker
På andre språk...                            


7 svar

stemmer
5

Du kan bruke SHIFT for dette. Det fjerner% 1 og flytter alle andre argumenter en lavere. Dette skriptet sender alle argumenter etter% 2 (slik at det utganger% 3,% 4 ...) til en av dem er tom (så det er det siste):

@echo off

SHIFT
SHIFT

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

:end

EDIT: Fjernet eksempel ved hjelp av% * da dette ikke fungerer -% * alltid sender alle parametrene

Svarte 01/06/2009 kl. 16:37
kilden bruker

stemmer
1

Bygger på schnaader svar, jeg tror dette gjør det hvis du vil ha alt etter% 1 sammensatt.

@echo off

SHIFT

set after1=

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


:end

echo %after1%
Svarte 01/06/2009 kl. 16:43
kilden bruker

stemmer
16

Jeg er ikke sikker på om det er en direkte kommando, men du kan alltid bruke en enkel sløyfe og skifte for å få resultatet i en variabel. Noe som:

@echo off
satt RESTVAR =
skifte
: loop1
Hvis "% 1" == "" goto after_loop
satt RESTVAR =% RESTVAR%% 1
skifte
goto loop1

: after_loop
echo% RESTVAR%

Gi meg beskjed hvis det hjelper!

Svarte 01/06/2009 kl. 16:50
kilden bruker

stemmer
27

Det er en kortere oppløsning (l-liner) utnytte tokenisering egenskapene til forløkker:

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

produksjon:

> all_but_first.bat foo bar baz
all: foo bar baz
all but first: bar baz
Svarte 04/11/2014 kl. 10:29
kilden bruker

stemmer
4

Følgende vil arbeide for args med ", =, ' '(i forhold til @MaxTruxa svar)

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

Test

> get_tail.cmd "first 1" --flag="other options" --verbose
"first 1" --flag="other options" --verbose
--flag="other options" --verbose
Svarte 30/04/2017 kl. 01:01
kilden bruker

stemmer
4

Følgende vil arbeide for args med", =, ''. Basert på Dmitry Sokolov svar. Fikset problem når andre arg er den samme som første arg.

@echo off
echo %*
set _tail=%*
call set _tail=%%_tail:*%1=%%
echo %_tail%
Svarte 30/08/2017 kl. 20:32
kilden bruker

stemmer
1

Sebi, her er Syntax ! Det er en atferd, batch spise likhetstegn som ikke er dobbelt sitert, det føre til problemer i skript over. Hvis du kontaktskjemaet til å hoppe, jeg har gjort en endring, basert på Raman Zhylich svar og 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%"
Svarte 10/07/2018 kl. 21:54
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more