Transmettre les paramètres nommés au script par lots avec des caractères spéciaux

Aug 20 2020

J'ai trouvé et modifié un extrait de code pour permettre le passage de paramètres nommés illimités à un script batch.

Accès à un nombre inconnu de commandes (paramètres) dans le fichier de commandes

Tout fonctionnait très bien, mais maintenant je construis dans Wildcard la vérification dans le script et j'ai trouvé si je transmettais une valeur comme celle-ci "FILEPATH=C:\tmp\test *.txt"qui FILEPATHn'est pas définie par mon extrait de code. Comme je ne l'ai pas vraiment créé, je ne sais en partie pas comment cela fonctionne et pourrait être modifié pour autoriser les caractères spéciaux.

Voici l'extrait de code pour autoriser les paramètres nommés que j'aimerais obtenir des conseils sur la modification:

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

Mettre à jour:

J'ai changé la boucle for en for /F delims^=^"^ tokens^=* %%x in (%*) do (et il va maintenant définir le FILEPATH avec une WILDCARD, mais il supprime le premier ", puis transforme tous les arguments en une seule ligne et supprime également le final ". Peut-être ai-je besoin d'un moyen d'utiliser le argcountpour corréler la position alphanumérique de la set %%xligne?

Une autre pensée, puisque la modification ci-dessus de la boucle for accepte le joker, mais crée une seule variable longue contenant tous les paramètres passés à script.cmd, peut-être que je peux boucler dessus (la variable longue) à nouveau et diviser les arguments nommés.

Mettre à jour:

Exemple d'utilisation:

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

Réponses

1 Gerhard Aug 20 2020 at 07:25

Utilisation de votre méthode actuelle en définissant FILEPATH=comme paramètre.

Remarque: je dois dire que cette tendance est un peu dangereuse. La raison en est que si l'une des variables d'entrée contient quelque chose comme PATH=Somepathcela, cela interrompra l'environnement immédiat pendant l'exécution du script. Assurez-vous donc de vérifier les types d'entrée qui seront transmis.

@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

Ma solution complète basée sur la réponse géniale de @ Gerhard. Cela me permet toujours de prendre une quantité illimitée de variables entrées dans un ordre inconnu dans le "VALUE=KEY"format, et de ne pas connaître l' FILEPATHargument de position, mais comme le lot a des limites à l'utilisation uniquement, %1-->%9je me suis senti le plus facile / préférable de gérer / permettre que ce FILEPATHsoit l'un des 9 premiers PARAMS. Cela m'a vraiment appris sur les choses que vous considérez comme allant de soi dans des shells comme BASH et aussi, ce que BASH fait "dans les coulisses". L'idée était d' script.cmdintégrer une recherche par joker car mon sera toujours appelé par un "script parent" avec des paramètres et je veux qu'il soit similaire à BASH(autoriser les utilisateurs finaux à utiliser des jokers).

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

Résultat:

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