Vérifier si une variable correspond au début d'une autre dans Batch

0

Dans un script batch, je dois rediriger le flux de script en fonction de la correspondance entre une variable et le début d'une autre. En particulier, je veux faire quelque chose comme ceci:

IF %CD% BEGINSWITH %USERPROFILE% (Echo You can do stuff here!) ELSE (Echo You don't belong here!)

J'ai eu du mal à trouver quoi que ce soit pour résoudre ce problème en ligne, ou du moins quelque chose qui ait un sens pour moi. Si cela est faisable, veuillez démontrer comment et pourquoi la solution viable fonctionne.

Iszi
la source

Réponses:

1

La réponse Iszi semblera souvent fonctionner, mais elle peut donner un résultat erroné dans de nombreuses circonstances.

  • La recherche FINDSTR peut ne pas correspondre correctement s'il existe une différence de casse. Résolu en utilisant l' /Ioption.

  • FINDSTR traitera la chaîne de recherche comme deux chaînes de recherche ou plus si le nom du profil comprend un espace. Mieux vaut utiliser l' /C:"searchString"option.

  • FINDSTR fera une recherche de regex si %USERPROFILE%inclut un méta-caractère de regex comme .. Cela peut être résolu en forçant une recherche littérale à l'aide de l' /Loption ou de l' /C:"searchString"option.

  • Les barres obliques inverses peuvent être un peu délicates avec FINDSTR, car elles sont utilisées par FINDSTR comme caractère d'échappement. Plus sûr d'échapper à toutes les barres obliques inverses \\.

  • La commande ECHO peut échouer si le nom du répertoire en cours contient un caractère spécial tel que &. La CDcommande imprimera en toute sécurité le répertoire en cours sans avoir à se soucier des caractères spéciaux.

De plus, comme FINDSTR est utilisé comme test et que la ligne correspondante ne présente aucun intérêt, la sortie doit être redirigée vers NUL.

Et enfin, la solution peut être simplifiée en remplaçant l'instruction IF par les opérateurs conditionnels &&et ||.

Le code suivant devrait toujours fonctionner:

cd|findstr /bic:"%userprofile:\=\\%" >nul&&echo You can do stuff here!||echo You don't belong here!

Mise à jour - Exemple de casse de lettre de lecteur variable

Voici une session Windows 7 cmd.exe qui montre comment la casse de la lettre de lecteur indiquée par CD(ou %CD%) peut varier:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\>set userprofile
USERPROFILE=C:\Users\Dave

C:\>cd c:\users\Dave

c:\Users\Dave>cd
c:\Users\Dave

c:\Users\Dave>echo CD=%CD%
CD=c:\Users\Dave

c:\Users\Dave>cd..

c:\Users>cd C:\users\Dave

C:\Users\Dave>cd
C:\Users\Dave

C:\Users\Dave>echo CD=%CD%
CD=C:\Users\Dave

C:\Users\Dave>
Dbenham
la source
Pour ce script particulier, l' /Ioption n'est pas nécessaire. Puisque nous faisons correspondre les variables de sortie de commande et / ou d’environnement, sans la participation de l’utilisateur, il n’ya aucune chance que la casse ne corresponde. Merci pour la clarification, cependant.
Iszi
@Iszi - En fait, vous avez besoin du /Icommutateur car CDvous pouvez signaler la lettre de lecteur en minuscule ou en majuscule, selon la manière dont le répertoire actuel a été spécifié. En outre, la %USERPROFILE%valeur correspond probablement à la casse des noms de dossiers réels, mais elle ne doit pas nécessairement correspondre à la casse.
Dbenham
Je suis confus. Peu importe la manière dont je mets CDdans un dossier, si par la suite je lance CDsans aucun argument, il renvoie le chemin dans son cas propre (tel que stocké dans le système de fichiers). %USERPROFILE%renvoie également le chemin du profil de l'utilisateur dans sa casse appropriée. Ainsi, si j’ai CD /D c:\users\mealors la sortie de mon prochain CD(sans argument), C:\Users\Mece sera exactement ce qui va correspondre %USERPROFILE%- cas et tout - si j’exécute des commandes en tant que "Moi".
Iszi
@Iszi - Voir la réponse mise à jour
dbenham
Intéressant. Je n'avais jamais observé, ou du moins jamais remarqué, cela auparavant. Encore une fois, pour mes utilisations (les utilisateurs ne feront que double-cliquer sur le script depuis une fenêtre de l'Explorateur), le point est toujours sans objet - mais c'est une très bonne information à avoir. Merci!
Iszi
0

J'ai fini par le découvrir moi-même. Je ne sais pas trop pourquoi je n'ai pas remarqué cette solution ailleurs.

ECHO %CD%|FINDSTR /B "%USERPROFILE%"
IF %ERRORLEVEL% EQU 0 (Echo You can do stuff here!) ELSE (Echo You don't belong here!)

Normalement, FINDSTRrecherche des chaînes dans un fichier texte donné. Cependant, il peut également accepter les entrées du pipeline. Ici, nous utilisons ECHOhabituellement le répertoire courant ( %CD%) dans le pipeline, puis nous demandons FINDSTRde rechercher le dossier de profil de l'utilisateur ( "%USERPROFILE%"- guillemets obligatoires) au début ( /B) des données acheminées.

Puisque FINDSTRrenvoie un an ERRORLEVEL, nous pouvons vérifier cela avec une IFdéclaration ultérieure , puis procéder en conséquence.

Iszi
la source