2010-11-17 5 views
2

Je suis en train de créer un script batch qui doit parcourir les lignes dans un fichier, en recherchant une chaîne, et s'il y a un préfixe de correspondance avec un '#' (commenter) .Traitement de chaîne à l'aide du script batch

Je suis tout à fait nouveau pour script batch, tout ce que je suis arrivé à ce point est:

for /f %%j in (CMakeLists.txt) do (
    if "%%j"=="Extensions_AntTweakBar" (
     echo lol1 
    ) 
    if "%%j"=="Extensions_Inspection" (
     echo lol2 
    ) 
    if "%%j"=="Extensions_InspectionBar" (
     echo lol3 
    ) 
) 

Donc mon problème actuel est, je ne sais pas comment faire fonctionner sur chaîne dans les scripts de traitement par lots. Si quelqu'un pouvait me aider ce serait apprécié :)

+0

Cela peut être fait en chauve-souris ... mais pourquoi l'avez-vous choisi? –

+0

Pouvez-vous fournir un exemple de fichier afin que nous puissions voir s'il y a un formatage de texte à conserver, par exemple, des lignes blanches, des indentations, etc. ou pouvez-vous affirmer avec certitude que ce n'est pas un problème? ? –

+0

Ceci peut facilement être accompli dans le vieux DOS simple. Je l'ai fait 1000 fois sinon plus. Je reviendrai sur cette question ce soir - Noël est arrivé! –

Répondre

2

Vous pouvez simplement utiliser le texte que vous souhaitez ajouter suivi de votre variable en général.

C:\>set MY_VAR=Hello world! 
C:\>echo #%MY_VAR% 
#Hello world! 

C:\>set MY_VAR=#%MY_VAR% 
C:\>echo %MY_VAR% 
#Hello world! 

Si vous faites juste l'écho, c'est bien. echo #%%j fera ce que vous avez besoin. Mais si vous voulez définir la ligne à une variable, vous devez enable delayed expansion. Ajoutez setlocal ENABLEDELAYEDEXPANSION au début de votre fichier, puis entourez vos variables avec ! au lieu de %. Par exemple (et l'avis que j'ai ajouté delims= pour mettre toute la ligne dans %%j au lieu du premier mot sur la ligne):

@echo off 

setlocal ENABLEDELAYEDEXPANSION 

set LINE= 
for /f "delims=" %%j in (CMakeLists.txt) do (
    set LINE=%%j 
    if "%%j"=="Extensions AntTweakBar" (
     set LINE=#%%j 
    ) 
    if "%%j"=="Extensions Inspection" (
     set LINE=#%%j 
    ) 
    if "%%j"=="Extensions InspectionBar" (
     set LINE=#%%j 
    ) 

    echo !LINE! 
) 

Compte tenu de ce fichier d'entrée:

Extensions AntTweakBar 
some text 
Extensions Inspection 
Extensions What? 
some more text 
Extensions InspectionBar 
Extensions InspectionBar this line doesn't match because delims= takes all text 
even more text 

Le script ci-dessus produit cette sortie:

C:\>comment.bat 
#Extensions AntTweakBar 
some text 
#Extensions Inspection 
Extensions What? 
some more text 
#Extensions InspectionBar 
Extensions InspectionBar this line doesn't match because delims= takes all text 
even more text 

Et bien sûr, la suppression @echo off vous aidera à des problèmes de débogage. Mais tout cela étant dit, vous êtes à la limite de ce que vous pouvez accomplir avec le traitement de chaîne de traitement par lots. Si vous souhaitez toujours utiliser des commandes par lots, vous devrez peut-être commencer à écrire des lignes dans des fichiers temporaires et à utiliser findstr avec une expression régulière.

+0

C'est à peu près ce que je faisais maintenant, je l'ai corrigé moi-même :) - mais +1 :) – Skeen

0

Sans une meilleure compréhension de ce que vous voulez dans votre boucle ou ce que votre fichier CMakeLists.txt ressemble, essayez ceci pour commencer:

FINDSTR "SOMETHING" %%J && ECHO #%%J || ECHO %%J 

Le & & conditionne la deuxième commande (l'ECHO) à la sortie de la première commande sans état d'erreur, et le || est comme un OU logique et il s'exécute quand le premier ne le fait pas.

Vraiment, pour modifier le fonctionnement interne d'un fichier texte que vous allez probablement être beaucoup mieux en utilisant soit sed ou awk - binaires win32 peuvent être trouvés dans le projet UnxUtils.

+0

Je le sais, le problème est cependant que je ne peux pas avoir de dépendance en tant que sed ou awk, ce qui serait autrement la bonne chose à faire.- J'ai mis à jour la partie principale avec un peu plus de code, cela semble fonctionner, elle trouve maintenant les 3 lignes importantes, mais comment les préfixer avec un '#'? – Skeen

+0

@Skeen - pouvez-vous avoir une dépendance sur PowerShell ou quelque chose de plus capable de traitement de texte? – Goyuix

Questions connexes