8
votes

Vérifiez "si" conditionne à l'intérieur de la boucle (lot / cmd)

Le code que j'ai besoin d'implémenter dans un fichier de commandes de Windows est comme celui-ci (il est actuellement en Perl): XXX

Mes questions sont les suivantes:

  1. est ce niveau de complexité possible dans Windows Batch Files?
  2. Si oui, comment puis-je mettre une condition si à l'intérieur d'une boucle pour lire un texte Fichier?

    Merci de votre attention. Si vous connaissez les réponses, ou avez-vous des idées / indices sur la manière d'atteindre la réponse, merci de les partager.

    Edit: je travaille dans Windows. Je peux utiliser uniquement tout ce qui est fourni avec Windows par défaut et cela signifie que je ne peux pas utiliser les utilitaires UNIX.


2 commentaires

Premier état du type de lot que vous voulez. Bash, par exemple, peut faire beaucoup plus et beaucoup plus simple que la cmd.exe de NT. Votre réponse détermine la réponse à la question.


En particulier, travaillez-vous dans l'environnement Win32 ou UNIX?


6 Réponses :


2
votes

Je pense que c'est trop de douleur à faire dans cmd.exe, et même impossible, même si je me trompe peut-être sur le dernier.

Vous feriez mieux d'utiliser WSH (hôte de script Windows), ce qui vous permet d'utiliser Jscript ou VBScript et est présent dans presque tous les systèmes. (Et vous pouvez fournir une redistribuabilité si vous le souhaitez)


2 commentaires

Split, par exemple, est très difficile à faire avec les fenêtres de base, j'imagine.


Split serait fait avec pour / f . Pas exactement jolie syntaxe mais pas exactement difficile non plus.



1
votes

Voici un équivalent de VBScript rugueux de votre script Perl. xxx

Pour vos informations, il y a toujours le Perl pour Windows que vous pouvez utiliser, sans avoir à apprendre une autre langue.


3 commentaires

Bonjour, merci pour le VBScript. Il semble être une bonne alternative pour le lot. En ce qui concerne Perl sous Windows, oui, j'utilise Perl sous Windows. Mais le code que je veux en lot est pour un client, qui - Dieu sait pourquoi - ne veut pas installer Perl sur son PC :-)


Vous pouvez installer Perl2exe et convertir votre script Perl en un exécutable pour la distribution.


-1 pour fournir une mise en œuvre de VBScript au lieu de Jscript (non, je plaisante)



0
votes

Vous pouvez transformer le programme Perl en une .exe qui n'aura pas besoin de Perl avec Par :: Packer (même cryptage est possible). Mieux vaut utiliser Perl de la fraise pour Windows pour fonctionner avec Par :: Packer, mais à l'aide d'ActivePerl est également possible.


0 commentaires

2
votes

Je n'ai aucune expérience avec Perl, mais si je comprends votre commande correctement, ce serait comme ça. Méfiez-vous que les scripts par lots sont très primitifs et qu'il n'a pas de bonnes méthodes de désinfectation, certains caractères (& | surtout) vont briser cela en morceaux.

@ECHO OFF
SETLOCAL
SET COUNT=0
FOR /F "DELIMS=" %%A IN ('file') DO CALL :SCAN %%A
:SCAN
ECHO %*|FIND "xxxx">NUL
IF %ERRORLEVEL%==0 ECHO xxxx is found&GOTO :EOF
ECHO %*|FIND "yyyy">NUL
IF %ERRORLEVEL%==0 GOTO :EOF
FOR /F "TOKENS=1,2 DELIMS=:" %%A IN ('ECHO %*') DO SET ARRAY1[%COUNT%]=%%A&SET ARRAY2[%COUNT%]=%%B
SET /A COUNT+=1


0 commentaires

14
votes

Mettre en place si code> dans pour code> en général est facile: xxx pré>

A pour code> boucle qui itière Les lignes peuvent être écrites en utilisant le commutateur / F CODE>: P>

set count=0
for /f "delims=" %%s in (foo.txt) do (
    echo %%s | findstr /r xxxx > NUL
    if errorlevel 1 (
        rem ~~~ Didn't match xxxx ~~~
        echo %%s | findstr /r yyyy > NUL
        if errorlevel 1 (
            rem ~~~ Didn't match yyy ~~~
            for /f "delims=; tokens=1,*" %%a in ('echo %%s') do (
                 set array1[!count!]=%%a
                 set array2[!count!]=%%b
                 set /a count+=1
            )
        )
    ) else (
        echo XXX is found
    )
)


2 commentaires

La raison pour laquelle Minaev écrit Array [! Comptez!] Au lieu d'un tableau [% Nombre%] est que les variables à l'intérieur d'une boucle de boucle sont étendues dès que la boucle est exécutée, le nombre serait donc toujours lu sous la forme de 0 pendant la boucle. Il est donc nécessaire d'utiliser une expansion variable retardée de sorte que la valeur soit étendue chaque fois que la ligne est lue. Quoi qu'il en soit, mon avertissement s'applique ici aussi: si le fichier a des caractères comme <> | & le script de lot se conduira mal.


Oui, c'est le moyen de le faire dans le fichier de lots. Mais cela doit être réservé aux experts par lots qui devront le maintenir.



1
votes

C'est possible!
FOR ................. DO  (
    (YOUR_CONDITION && echo "YES" ) ||  (echo "NO")
)


0 commentaires