Übergeben Sie benannte Parameter an Batch-Skripte mit Sonderzeichen

Aug 20 2020

Ich habe ein Code-Snippet gefunden und geändert, um die Übergabe unbegrenzt benannter Parameter an ein Batch-Skript zu ermöglichen.

Zugriff auf eine unbekannte Anzahl von Befehlen (Parametern) in der Batchdatei

Alles hat super funktioniert, aber jetzt baue ich Wildcard ein und überprüfe das Skript. Ich habe festgestellt, ob ich einen Wert wie diesen übergebe "FILEPATH=C:\tmp\test *.txt", FILEPATHder nicht durch mein Code-Snippet definiert wird. Da ich es nicht wirklich erstellt habe, weiß ich teilweise nicht, wie es funktioniert, und kann geändert werden, um Sonderzeichen zuzulassen.

Hier ist das Code-Snippet, um benannte Parameter zuzulassen, die ich gerne ändern möchte:

::Set Named Arguments
set argCount=0
for %%x in (%*) do (
   set /A argCount+=1
   set "argVec[!argCount!]=%%~x"
   set %%x
)

Aktualisieren:

Ich habe die for-Schleife in geändert for /F delims^=^"^ tokens^=* %%x in (%*) do (und sie definiert jetzt den FILEPATH mit einer WILDCARD, aber sie entfernt die erste "und macht dann alle Argumente in einer Zeile und entfernt auch die letzte ". Vielleicht brauche ich eine Möglichkeit, argcountdie alphanumerische Position der set %%xLinie zu korrelieren ?

Ein anderer Gedanke: Da die obige Änderung an der for-Schleife den Platzhalter akzeptiert, aber eine einzelne lange Variable erstellt, die alle übergebenen Parameter enthält script.cmd, kann ich sie möglicherweise erneut durchlaufen (die lange Variable) und die genannten Argumente aufteilen.

Aktualisieren:

Anwendungsbeispiel:

script.cmd:

@ECHO OFF
CLS
::Set Named Arguments
set argCount=0
for %%x in (%*) do (
   set /A argCount+=1
   set "argVec[!argCount!]=%%~x"
   set %%x
)
ECHO %FILEPATH%
ECHO %VAR%
EXIT /B

test.cmd:

@ECHO OFF
CLS

::Doesn't Work
CALL "C:\tmp\script.cmd" "FILEPATH=C:\tmp\tes*.txt" "VAR=2"
PAUSE
::Works Fine
CALL "C:\tmp\script.cmd" "FILEPATH=C:\tmp\test.txt" 
PAUSE

Antworten

1 Gerhard Aug 20 2020 at 07:25

Verwenden Sie Ihre aktuelle Methode, indem Sie sie FILEPATH=als Parameter definieren.

Hinweis: Ich muss zum Ausdruck bringen, dass dies ein wenig gefährlich ist. Grund dafür ist, dass eine der Eingabevariablen, die so etwas enthält PATH=Somepath, die unmittelbare Umgebung zerstört, während das Skript ausgeführt wird. Stellen Sie daher sicher, dass Sie die Eingabetypen überprüfen, die übergeben werden.

@echo off & setlocal enabledelayedexpansion
(set "%~1" & set "%~2" & set "%~3" & set "%~4")>nul
set argCount=0
if defined FILEPATH (
  for %%x in ("%FILEPATH%") do (
     set /A argCount+=1
     set "argVec[!argCount!]=%%~x"
     echo argVec[!argCount!]
 )
 echo %FILEPATH%
) else (
 echo FILEPATH not defined
)
FreeSoftwareServers Aug 20 2020 at 16:34

Meine vollständige Lösung basiert auf @ Gerhards großartiger Antwort. Dies ermöglicht es mir immer noch, eine unbegrenzte Anzahl von Variablen in unbekannter Reihenfolge im "VALUE=KEY"Format einzugeben und das FILEPATHPositionsargument nicht zu kennen. %1-->%9Da der Stapel jedoch nur Einschränkungen bei der Verwendung aufweist, hielt ich es für am einfachsten / besten, eine FILEPATHder ersten 9 zu handhaben / zuzulassen PARAMS. Dies hat mich wirklich gelehrt, was Sie in Muscheln wie BASH für selbstverständlich halten und was BASH "hinter den Kulissen" tut. Die Idee war, die Platzhaltersuche einzubauen, da mein script.cmdWille immer von einem "übergeordneten Skript" mit Parametern aufgerufen wird und ich möchte, dass es ähnlich ist BASH(Endbenutzern erlauben, Platzhalter zu verwenden).

script.cmd:

@ECHO OFF
CLS
::SET Named Arguments
SET argCount=0
for %%x in (%*) do (
   SET /A argCount+=1
   SET "argVec[!argCount!]=%%~x"
   SET %%x
)

::Wildcards in FilePath?
(SET "%~1" & SET "%~2" & SET "%~3" & SET "%~4" & SET "%~5" & SET "%~6" & SET "%~7" & SET "%~8" & SET "%~9")>nul
SET argCount=0
IF DEFINED FILEPATH (
  FOR %%x IN ("%FILEPATH%") DO (
     SET /A argCount+=1
     SET "argVec[!argCount!]=%%~x"
 )
 CALL :FindFileWildCard "%FILEPATH%" FILEPATH
) ELSE (
   ECHO No "FILEPATH=C:\path\print.doc" Defined!
   PAUSE
   GOTO:EOF
)

ECHO %FILEPATH%
ECHO %VAR%
ECHO %VAR2%
ECHO %VAR3%
ECHO %VAR4%
ECHO %VAR5%
ECHO %VAR6%
ECHO %VAR7%
ECHO %VAR8%
ECHO %VAR9%
ECHO %VAR10%
GOTO :EOF

::Functions
:FindFileWildCard
::Does Path contain WildCards?
ECHO "%~1" | FIND /i "*" >nul
IF %ERRORLEVEL% EQU 0 (
 FOR /F "Tokens=*" %%F IN ('DIR /B /S "%~1"') DO (
 SET %2=%%F
 EXIT /B
 )
)
ECHO "%~1" | FIND /i "?" >nul
IF %ERRORLEVEL% EQU 0 (
 FOR /F "Tokens=*" %%F IN ('DIR /B /S "%~1"') DO (
 SET %2=%%F
 EXIT /B
 )
)
EXIT /B

:EOF

test.cmd:

@ECHO OFF
CLS

CALL "C:\tmp\script.cmd" "VAR=VAR" "VAR2=VAR2" "VAR3=VAR3" "FILEPATH=C:\tmp\tmp space\te*.txt"  "VAR4=VAR4" "VAR5=VAR5" "VAR6=VAR6" "VAR7=VAR7" "VAR8=VAR8" "VAR9=VAR9" "VAR10=VAR10"
PAUSE
CALL "C:\tmp\script.cmd" "VAR=VAR" "VAR2=VAR2" "VAR3=VAR3" "FILEPATH=C:\tmp\tmp space\test with spa?*.txt"  "VAR4=VAR4" "VAR5=VAR5" "VAR6=VAR6" "VAR7=VAR7" "VAR8=VAR8" "VAR9=VAR9" "VAR10=VAR10"
PAUSE
CALL "C:\tmp\script.cmd" "VAR=VAR" "VAR2=VAR2" "VAR3=VAR3" "FILEPATH=C:\tmp\test.txt"  "VAR4=VAR4" "VAR5=VAR5" "VAR6=VAR6" "VAR7=VAR7" "VAR8=VAR8" "VAR9=VAR9" "VAR10=VAR10"
PAUSE

Ergebnis:

C:\tmp\tmp space\test with space.txt
VAR
VAR2
VAR3
VAR4
VAR5
VAR6
VAR7
VAR8
VAR9
VAR10
Press any key to continue . . .