Comment effectuer une comparaison de chaînes génériques dans un fichier batch

Mon fichier batch écrit une liste de fichiers à l'écran où il contient l'extension .cs.

for /F "usebackq delims=" %%A in (`cleartool ls -rec ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->"`) do ( if "%%~xA"==".cs" echo %%A ) 

Cela fonctionne bien. Je souhaite améliorer la fonctionnalité en ajoutant une autre condition. Je veux supprimer un certain mot s'il existe dans la phrase. Le mot est obj

Des exemples de mes résultats sont

MyThing \ obj \ this.cs
Obj \ other \ that \ this.cs
Dépouillez \ this \ that.cs

j'ai essayé

 for /F "usebackq delims=" %%A in (`cleartool ls -rec ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->"`) do ( if "%%~xA"==".cs" if NOT "%%A"=="*obj*" echo %%A ) 

Mais cela ne modifie pas les résultats par rapport au premier.

Je pense que ma syntaxe if est correcte, et le problème est en réalité avec "%%A"=="*obj*"

Vous pensiez correctement: les caractères génériques ( * ) ne sont pas pris en charge.

Une bonne solution de contournement pour le problème est findstr , même si vous devez récupérer le résultat via %ERRORLEVEL% et je pense que vous devez le mettre en cache à travers une autre variable (de sorte que la prochaine ne remplace pas sa valeur):

 echo %%A | findstr /C:"obj" set obj_errorlevel=%errorlevel% if "%%~xA"==".cs" if "%obj_errorlevel%"=="1" echo %%A 

… mais c'est difficile.

Un moyen encore plus simple est d'ajouter la condition à la commande source (celle dans if ) en ajoutant un autre étage de pipe: ^| find /V "obj" ^| find /V "obj" :

 for /F "usebackq delims=" %%A in (`cleartool ls -rec ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->" ^| find /V "obj"`) 

Je crois que votre édition est correcte, en ce sens que vous ne pouvez pas utiliser des caractères génériques dans la comparaison If. C'est en train de chercher *obj* , y compris les astérisques.

Peut-être utiliser FindStr à la place, en tuant des correspondances .cs travers elle. Il renvoie un niveau d'erreur de 0 si trouvé, et 1 s'il n'est pas trouvé.

Exemple de code:

 for /F "usebackq delims=" %%A in (`cleartool ls -rec ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->"`) do ( if "%%~xA"==".cs" echo %%A | findstr /C:"obj" 1>nul & if errorlevel 1 echo %%A ) 

Je ne pense pas que vous pouvez utiliser 2 si c'est comme ça. Essayer:

 for xxxxxxx ( if first-condition ( if second-condition ( statement(s) ) ) ) 

Les astérisques ne sont pas interprétés comme des caractères génériques, donc la condition est évaluée comme fausse. Au lieu d'une seconde instruction if, vous pouvez utiliser findstr pour déterminer si la variable contient le texte 'obj'. La commande définit %errorlevel% to zero si une correspondance a été trouvée, à zéro sinon.

Un moyen pratique d'utiliser cette valeur est à travers les séperateurs de commande conditionnelle && et || . Une commande ajoutée avec || Ne sera exécuté que si la commande précédente a renvoyé un niveau d'erreur différent de zéro, par exemple:

 (echo %%A | findstr /R .*obj.*)>NUL || if "%%~xA"==".cs" echo %%A 

L'ajout de >NUL est important dans ce scénario. Sans supprimer la sortie, la première ligne et la deuxième ligne pourraient imprimer la variable %%A Pour éviter toute confusion, vous voudrez que différents cas produisent des résultats différents.

Bien sûr, si vous utilisez déjà findstr , vous pouvez vous débarrasser de l'énoncé if et de son corps. La lisibilité n'est pas géniale dans les deux cas; Le code ci-dessous est fourni comme alternative.

 (echo %%A|findstr /R /V ".*obj.*")|findstr /R /C:"\.cs $" 

Une solution qui pourrait fonctionner pour ce que vous voulez faire. Cela utilise la substitution de chaîne de SET , comme expliqué dans le site de Rob van der Woude .

 @echo off set _myvar=this\has\obj\in the string echo Original: %_myvar% ::replace the string obj in _myvar set _myvar=%_myvar:obj=% ::replace any double back-slashes in _myvar set _myvar=%_myvar:\\=\% echo Withou obj: %_myvar% 

_myvar contient à l'origine la chaîne 'obj'. La première fois que nous supprimons la chaîne à l'aide de la substitution de chaîne SET. La deuxième fois, nous supprimons toutes les barres obliques qui pourraient être abandonnées en raison de l'emplacement de 'obj'. Après le colon, vous avez la chaîne que vous souhaitez rechercher dans la variable. La chaîne à remplacer vient après le signe égal avant la fin de la substitution.

J'espère que cela pourra aider!

Essayez d'étendre le contenu de yourfile.cs et de remplacer le mot ou la lettre par le caractère désiré, soit rien, ni quelque chose. Voici mon idée.

Faites glisser le fichier .cs sur l'icône du fichier batch pour l'ouvrir afin que le fichier .cs soit param 1

 @echo off setlocal EnableDelayedExpansion set /pa= enter letter to change: set /pb= enter letter to change to: set /p file=<%1 for /f %%c in ("!file:~!") do ( set "code=!file:%a%=%b%!" echo !code!>myfile.cs ) 

Change myfile.cs sur n'importe quel nom que vous voulez

Améliorez mes ans pour de meilleures fonctions.