Transmettre les paramètres nommés au script par lots avec des caractères spéciaux
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 FILEPATH
n'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 argcount
pour corréler la position alphanumérique de la set %%x
ligne?
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
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=Somepath
cela, 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
)
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' FILEPATH
argument de position, mais comme le lot a des limites à l'utilisation uniquement, %1-->%9
je me suis senti le plus facile / préférable de gérer / permettre que ce FILEPATH
soit 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.cmd
inté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 . . .