Comment conditionnellement à prendre des mesures si FINDSTR ne parvient pas à trouver une chaîne de caractères
J'ai un fichier de commandes comme suit;
CD C:\MyFolder
findstr /c:"stringToCheck" fileToCheck.bat
IF NOT XCOPY "C:\OtherFolder\fileToCheck.bat" "C:\MyFolder" /s /y
Je reçois un message d'erreur ("C:\OtherFolder\fileToCheck.bat" c'était inattendu, à ce moment.) lorsque vous essayez d'exécuter cette.
S'il vous plaît laissez-moi savoir ce que je fais de mal.
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas à l'évaluation d'une condition pour le SI. Je devine que vous ne voulez pas copier si vous trouvez stringToCheck dans fileToCheck. Vous avez besoin de faire quelque chose comme (code non testé, mais vous voyez l'idée):
ÉDITION par dbenham
Le test ci-dessus est FAUX, il prend toujours la valeur FALSE.
Le bon test est
IF ERRORLEVEL 1 XCOPY ...
Mise à jour: je ne peux pas tester le code, mais je ne suis pas sûr de ce que la valeur de retour findstr renvoie en fait si il ne trouve pas de quoi que ce soit. Vous pourriez avoir à faire quelque chose comme:
IF NOT ERRORLEVEL 0
n'est vrai que si ERRORLEVEL est inférieur à 0.Je suppose que vous voulez copier C:\OtherFolder\fileToCheck.bat pour C:\MyFolder si le fichier existant dans C:\MyFolder est soit totalement absente, ou si il est manquant "stringToCheck".
FINDSTR met ERRORLEVEL 0 si la chaîne est trouvée, 1 si elle ne l'est pas. Il définit également errorlevel 1 si le fichier est manquant. Il imprime aussi chaque ligne qui correspond. Puisque vous essayez de l'utiliser comme une condition, je présume que vous n'avez pas besoin ou envie de voir tout de la sortie. La 1ère chose que je suggère, c'est de rediriger la fois la normale et la sortie d'erreur à nul, à l'aide de
>nul 2>&1
.Solution 1 (presque le même que la réponse à la question précédente)
Vous pouvez utiliser
IF ERRORRLEVEL N
pour vérifier si la variable errorlevel est >= N. Ou vous pouvez utiliserIF NOT ERRORLEVEL N
pour vérifier si errorlevel est < N. Dans votre cas, vous voulez que l'ancien.Solution 2
Vous pouvez tester une valeur spécifique de errorlevel en utilisant %ERRORLEVEL%. Vous pouvez certainement vérifier si la valeur est égale à 1, mais il pourrait être plus sûr de vérifier si la valeur n'est pas égale à 0, car il est seulement mis à 0 si le fichier existe et qu'il contient la chaîne de caractères.
ou
Solution 3
Il est très compact, la syntaxe pour exécuter conditionnellement une commande en fonction de la réussite ou de l'échec de la commande précédente:
cmd1 && cmd2 || cmd3
qui signifie exécuter cmd2 si cmd1 a été un succès (errorlevel=0), sinon exécuter cmd3 si cmd1 échoué (errorlevel<>0). Vous pouvez utiliser && seul, ou || seul. Toutes les commandes doivent être sur la même ligne. Si vous avez besoin pour exécuter conditionnellement plusieurs commandes vous pouvez utiliser plusieurs lignes en ajoutant des parenthèsesDonc pour votre cas, vous avez besoin d'
Mais méfiez - vous-la
||
répondra à le code de retour de la dernière commande exécutée. Dans mon précédent pseudo-code le||
sera bien évidemment le feu si cmd1 échoue, mais il permettra également d'incendie si cmd1 réussit, mais alors cmd3 échoue.Donc, si votre succès bloc se termine par une commande qui peut échouer, alors vous devriez ajouter un danger de commande qui est garanti pour réussir. J'aime utiliser
(CALL )
, qui est inoffensif, et réussit toujours. Il est aussi maniable que l'on définit la variable ERRORLEVEL 0. Il y a un corollaire(CALL)
qui échoue toujours et met ERRORLEVEL 1.Sous DOS/Windows Lot de la plupart des commandes de retour d'un exitCode, appelé "niveau", c'est une valeur qui habituellement est égal à zéro si la commande se termine correctement, ou un nombre supérieur à zéro si prend fin en raison d'une erreur, avec plus de chiffres pour plus d'erreurs (d'où le nom).
Il ya un couple de méthodes pour vérifier que la valeur, mais l'original est:
Précédent SI le test si la variable errorlevel retourné par la commande précédente a été SUPÉRIEURE OU ÉGALE à la valeur donnée et, si cela est vrai, exécuter la commande. Par exemple:
Commande Findstr renvoie 0 si la chaîne a été trouvé et 1 si non:
Code précédent va copier le fichier si la chaîne n'a PAS été trouvé dans le fichier.
Code précédent copier le fichier si la chaîne a été trouvée. Essayez ceci:
J'ai essayé de le faire fonctionner à l'aide de FINDSTR, mais pour une raison quelconque, mon "débogage" commande toujours la sortie d'un niveau d'erreur de 0:
Ma solution de contournement consiste à utiliser Grep à partir de Cygwin, qui produit la droite errorlevel (il donne un niveau supérieur à 0) si une chaîne n'est pas trouvée:
Cygwin du grep sera également de sortie errorlevel 2 si le fichier n'est pas trouvé. Voici la table de hachage à partir de ma version:
C:\temp\temp>grep --version
grep (GNU grep) 2.4.2
C:\cygwin64\bin>md5sum grep.exe
c0a50e9c731955628ab66235d10cea23 *grep.exe
C:\cygwin64\bin>sha1sum grep.exe
ff43a335bbec71cfe99ce8d5cb4e7c1ecdb3db5c *grep.exe