2016-06-05 1 views
1

Überprüfen Sie bitte den folgenden Code und korrigieren. Danke im Voraus.Wie Iterate Eingabeargumente nach n-ten Argument im Batch-Skript

Start test.bat A B C D E F G H

set argCount=0 

for %%x in (%*) do (

set /A argCount+=1 
    if %argCount% gtr 3 (

    echo element after 3 argument %%x 
    ) 
) 

echo Number of processed arguments: %argCount% 
+1

Der 'shift' Befehl für Parameter verwendet wird, größer ist als 9. Siehe' Shift/'?. Machen Sie im Grunde eine Schleife, bis der n-te Parameter leer ist, und geben Sie jedesmal eine Verschiebung aus. –

+0

http://stackoverflow.com/questions/19835849/batch-script-iterate-through-arguments/19837690#19837690 – Aacini

Antwort

1

Sie benötigen delayed expansion:

setlocal enableDelayedExpansion 
set argCount=0 

for %%x in (%*) do (
    set /A argCount+=1 
    if !argCount! gtr 3 (
    echo element after 3 argument %%x 
    ) 
) 
echo Number of processed arguments: %argCount% 
0

Wow! Original npocmaka's code funktioniert nicht!

==> D:\bat\SO\37639143npocmaka.bat Wow! Original npocmaka's code does not work! 
Number of processed arguments: 1 

Sie müssen verzögerte Expansion wechseln wie folgt:

SETLOCAL EnableExtensions DisableDelayedExpansion 

set argCount=0 

for %%x in (%*) do (
    set /A argCount+=1 
    setlocal EnableDelayedExpansion 
    if !argCount! gtr 3 (
     endlocal 
     echo element after 3 argument %%x 
    ) else endlocal 
) 
echo Number of processed arguments: %argCount% 

Ausgang:

==> D:\bat\SO\37639143.bat Wow! Original npocmaka's code does not work! 
element after 3 argument code 
element after 3 argument does 
element after 3 argument not 
element after 3 argument work! 
Number of processed arguments: 7 

Oder auslassen delayed expansion überhaupt und im nächsten Code-Schnipsel (mein unverändert Probe-Skript) ändern:

@echo OFF 
SETLOCAL EnableExtensions DisableDelayedExpansion 
echo(
echo before any shift: all %%* = [%*] 
echo(
set /A "ii=0" 
    echo param %%%ii% = %0 
:loopfor 
    set /A "ii+=1" 
    echo param %%%ii% = %1 
    SHIFT /1 
    if not [%1]==[] goto :loopfor 
echo(
echo after %ii% shifts: %%* = [%*] 
goto :eof 

Ausgang:

==> cliparser.bat Wow! Original npocmaka's code does not work! 

before any shift: all %* = [Wow! Original npocmaka's code does not work!] 

param %0 = cliparser.bat 
param %1 = Wow! 
param %2 = Original 
param %3 = npocmaka's 
param %4 = code 
param %5 = does 
param %6 = not 
param %7 = work! 

after 7 shifts: %* = [Wow! Original npocmaka's code does not work!] 

==> 
+1

npocmaka-Code funktioniert absolut gut, aber mit einer Einschränkung, dass Argumente mit '!' Werden beschädigt. Ihr "Fix" beim Umschalten der verzögerten Expansion erreicht nichts. Die richtige Lösung besteht darin, die Variable FOR in einer Umgebungsvariablen zu speichern, bevor die verzögerte Erweiterung aktiviert wird, und dann auf env zu verweisen. Variable mit verzögerter Expansion. Aber ich verwende niemals eine FOR-Schleife, um Parameter zu iterieren, weil die Platzhalter '*' und '?' Expandiert werden. Stattdessen verwende ich immer eine GOTO-Schleife mit SHIFT - ähnlich wie bei Ihrem zweiten Code. – dbenham