Haben Windows-Batchdateien eine% * -Konstruktion?


Antworten:


10

Windows-Batchdateien (seit Windows XP, möglicherweise jedoch früher) unterstützen das %*Konstrukt, das ab% 1 alle Parameter auswertet.

Leider wird der SHIFTBefehl dadurch nicht berücksichtigt , sodass Folgendes nicht funktioniert:

@echo off
set EATEN=%1
shift

call other.bat %*

Der erste Parameter wird weiterhin an die zweite Batchdatei übergeben.


2
Hinweis: %*Erhält Leerzeichen / Anführungszeichen.
Aaron Digulla

10

Sie können alle Argumente zusammenfassen, indem Sie Folgendes verwenden:

set args=%1
shift
:start
if [%1] == [] goto done
set args=%args% %1
shift
goto start

:done
(use %args% here)

Dies funktioniert unabhängig davon, wie viele Argumente es gibt.



1

Ja, das tun sie.

Sie können Ihr Beispiel wie folgt schreiben:

@echo off
call other.bat %*

Außerdem: Shift wird unter Windows unterstützt ... Siehe hier .
In der Tat bestätigt dieser letzte Link, dass die Verschiebung in Kombination mit% * nicht funktioniert:

• Die Verwendung von% * mit Shift
  Shift hat keine Auswirkungen auf den Batch-Parameter% *.


Sorry Links waren schlecht ... sollte jetzt behoben werden.
Fretje

(Zitat) Die Verwendung von% * mit Shift Shift hat keine Auswirkungen auf den% * Batch-Parameter. (/ quote)
Wedge

Warum das Downvote? Die Frage betraf% * und nicht die Verschiebung.
Fretje

Ihre erste Antwort hatte nur "Ja, das tun sie", was kein offensichtlicher Link (oder keine Antwort) war. Ihre letzte Änderung ist viel mehr eine anständige Antwort, vielleicht ist das der Grund ...
thijs

Eigentlich geschah die Abwertung, nachdem ich weitere Erklärungen hinzugefügt hatte. Und ich stimme zu, dass der Link zu "Ja, das tun sie" nicht offensichtlich war, aber es war eine genaue Antwort auf die
vorliegende

0
@echo off
cls
setlocal enabledelayedexpansion

:: Disable the display of information by changing [set "_ENABLE_INFO="] to [set "_ENABLE_INFO=::"].
set "_ENABLE_INFO="
set _DBQ="

set "_PARMS.ORIGINAL=%*" && if defined _PARMS.ORIGINAL (
   if not defined _PARMS.IDX (
      echo Parameter Index^(es^) to extract eg.:
      echo 1 2 5 9 11 39 400
      set /p "_PARMS.IDX=>"
   )
   set "_PARMS.IDX=¡!_PARMS.IDX: =¡ ¡!¡"
   set "_PARMS.IDX=!_PARMS.IDX:¡¡=!"
   set "_PARMS.IDX=!_PARMS.IDX: =!"
   call :_FN_PROC.STRING %*
%_ENABLE_INFO% goto :FINISH
   goto :eof
) else (
   echo No input parameters.
)
goto :eof


:_FN_PROC.STRING
set "_PARMS.PROCESS.STRING=%*"
:_FN_PROC.STRING.LOOP
set "_PARMS.PROCESS.STRING=!_PARMS.PROCESS.STRING:%_DBQ%=¡!"
set /a _PARMS.COUNT+=1
for /f "tokens=1* delims= " %%a in ("!_PARMS.PROCESS.STRING!") do (
   set _PARMS.TMP.CHECK=%%a
   set _PARMS.PROCESS.STRING=%%b
   if "!_PARMS.TMP.CHECK!" NEQ "!_PARMS.TMP.CHECK:¡=!" (
      for /f "tokens=1* delims=¡" %%c in ("%%a !_PARMS.PROCESS.STRING!") do (
         set _PARMS.TMP.CHECK="%%c"
         set _PARMS.PROCESS.STRING=%%d
      )
   )
)

if "!_PARMS.IDX:¡%_PARMS.COUNT%¡=!" EQU "!_PARMS.IDX!" (
   set _PARMS.REMAINING=!_PARMS.REMAINING! !_PARMS.TMP.CHECK!
   set _PARMS.IDX=!_PARMS.IDX!{%_PARMS.COUNT%}
) else (
   set _PARMS.EXTRACTED=!_PARMS.EXTRACTED! !_PARMS.TMP.CHECK!
   set _PARMS.IDX=!_PARMS.IDX:¡%_PARMS.COUNT%¡=!
   set _PARMS.IDX=!_PARMS.IDX![%_PARMS.COUNT%]
)

if "!_PARMS.PROCESS.STRING: =!"=="" (set _PARMS.PROCESS.STRING=)
if defined _PARMS.PROCESS.STRING (goto :_FN_PROC.STRING.LOOP)

set _DBQ=
set _PARMS.TMP.CHECK=
if defined _PARMS.REMAINING (set _PARMS.REMAINING=!_PARMS.REMAINING:~1!)
if defined _PARMS.EXTRACTED (set _PARMS.EXTRACTED=!_PARMS.EXTRACTED:~1!)
goto :eof


:FINISH
echo.
echo _PARMS.IDX ^:
echo    ¡^=¡ no Parameter Index was specified for extraction.
echo    ¡n¡ nth Parameter was not processed (Index larger than Parameters Count).
echo    [n] nth Parameter was Extracted.
echo    {n} nth Parameter was Ignored (Remaining).
echo.
set _
goto :eof

Erhält alle speziellen Trennzeichen. Unterstützt so viele Parameter, wie in ein 8175-Zeichen pro Befehlszeilenlimit eingepasst werden können (einschließlich Batch-Dateiname, CRLF und Batch-Pfad, falls angegeben). Parameter können in doppelte Anführungszeichen gesetzt werden (z. B. "sw1 = / quiet / skip: 1 / start = 3"). Hinweis: Doppelte Anführungszeichen bleiben erhalten. Das Verhalten von doppelten Anführungszeichen wird erwartet (auch wenn es falsch verwendet wird, z. B. nur einzeln oder "" oder ""). Bitte debuggen Sie zuerst den Code, bevor Sie einen Fehlerbericht erstellen.
Dharma Leonardi

Das ist eine sehr ausführliche Antwort, die viele Debug-Informationen enthält, obwohl sie die ursprüngliche Frage nicht direkt beantwortet: Wie geht das call other.batmit den angegebenen Parametern? (( Wo schreibe ich "other.bat"? Ist es möglich, "Parameterindex (e) zum Extrahieren zu entfernen? "Abfrage? Wird auch clsin der endgültigen Lösung nicht benötigt.
izogfif
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.