Porównaj ceny domen i usług IT, sprzedawców z całego świata

parametry partii: wszystko po% 1



Duplikować

:


Rozjaśnianie
: Wiedziałem o podejściu cyklicznym - działało jeszcze przed rozbudową zespołów; Miałem nadzieję na coś zabawnego i nieudokumentowanego, takiego jak% ~ * 1 lub cokolwiek innego - tak jak te udokumentowane w

http://www.microsoft.com/resou ... Dtrue
http://www.microsoft.com/resou ... Dtrue
.
W pliku wsadowym Windows (z włączonymi tak zwanymi "Rozszerzeniami poleceń")% 1 jest pierwszym argumentem,% 2 drugim itd.% * Czy wszystkie argumenty są połączone razem.
Moje pytanie brzmi, czy istnieje sposób, aby na przykład uzyskać wszystko PO% 2?
Nie mogłem znaleźć czegoś takiego i byłoby to pomocne w tym, nad czym pracuję.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Istnieje krótsze rozwiązanie (jedna linia) wykorzystujące możliwości tokenizacji pętli
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%

Wyjście:
> all_but_first.bat foo bar baz
all: foo bar baz
all but first: bar baz
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie jestem pewien, czy istnieje bezpośrednie polecenie, ale zawsze możesz użyć prostej pętli i przesunięcia, aby uzyskać wynik w zmiennej. Raczej:

@echo off
set RESTVAR=
shift:loop1
if "%1"=="" goto after_loop
set RESTVAR=%RESTVAR% %1
shift
goto loop1:after_loop
echo %RESTVAR%
Daj mi znać, jeśli to pomoże!
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Poniższe działania będą działać dla argumentów z ", =," '. Na podstawie odpowiedzi Dmitrija Sokolova. Naprawiono błąd, w którym drugi argument jest taki sam jak pierwszy.
@echo off
echo %*
set _tail=%*
call set _tail=%%_tail:*%1=%%
echo %_tail%
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Poniższe będzie działać dla argumentów z
"
,
=
,
''
(w porównaniu z odpowiedzią @ MaxTruxa)
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
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz do tego użyć SHIFT. Usuwa% 1 i przesuwa wszystkie inne argumenty o jeden w dół. Ten skrypt wypisuje wszystkie argumenty po% 2 (więc wypisuje% 3,% 4 ...) dopóki jeden z nich nie będzie pusty (więc to jest ostatni):
@echo offSHIFT
SHIFT:loop
if "%1" == "" goto end
echo %1
SHIFT
goto loop:end

EDYCJA: Usunięto przykład użycia% *, ponieważ to nie działa -% * zawsze wyświetla wszystkie opcje
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Opierając się na odpowiedzi Schneidera, myślę, że to robi, jeśli chcesz, aby wszystko po% 1 zostało połączone.
@echo offSHIFTset after1=:loop
if "%1" == "" goto end
set after1=%after1% %1
SHIFT
goto loop:endecho %after1%
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Sebi, tutaj

składnia
https://ss64.com/nt/syntax-replace.html
!
Istnieje zachowanie polegające na zjadaniu partii znaków równości, które nie są ujęte w podwójne cudzysłowy, co powoduje problemy w powyższych scenariuszach. Jeśli nie chcesz przegapić, dokonałem modyfikacji w oparciu o odpowiedź Ramana Zhilica i strlen.cmd:
@ECHO OFF
SETLOCAL enableDelayedExpansionSET _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%"

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się