8
votes

Fichier de lots: Comment remplacer "=" (signes égaux) et une variable de chaîne?

Outre SED, comment un signe égal peut-il être remplacé? Et comment puis-je utiliser une variable de chaîne dans le remplacement de chaîne?

considérer cet exemple: xxx

deux problèmes:

premier, je ne peux pas utiliser le variable% t% in!: = !. xxx

second, je ne peux pas remplacer le signe égal de la ligne de commande xxx / p>


5 commentaires

Travaillez-vous vraiment dans DOS ou voulez-vous simplement dire l'invite de commande Windows?


Eh bien, bien sûr, % T% ne peut pas fonctionner car il est remplacé avant la boucle est pareille.


Damien, c'est évidemment cmd .


@Joey - Bien sûr que c'est - mais j'adopte parfois un style rhétorique pour essayer de faire comprendre aux gens qu'ils sont inexacts dans leur terminologie.


Damien, j'ai depuis longtemps abandonné cela, je viens de modifier silencieusement;)


6 Réponses :


3
votes

Le SetLocal Enabledexpansion doit être déplacé après que votre ancienne affectation = %% B en cas %% B contient ! .

Le problème "T" est facile de Résolvez dans une boucle en utilisant un autre pour variable xxx

Il n'y a pas de solution de lot natif simple pour remplacer = . Vous pouvez parcourir la chaîne, le caractère par caractère, mais c'est lent. Votre meilleur pari est probablement de basculer vers VBScript ou JScript, ou utiliser un utilitaire non natif.

Si vous voulez vraiment faire cela à l'aide de commandes pure Windows Batch, il y a quelques idées intéressantes à http://www.dosteps.com/forum/viewtopic.php?t=1485


4 commentaires

Je vois. Peut-être que j'ai besoin d'approcher VBScript, VB ou C #. Il semble qu'ils sont une version avancée de la commande DOS. Que diriez-vous si le texte est comme ceci: c'est une pomme. Ceci est un chat. L'utilisation des codes se débarrasse de tout le "est". Nous savons comment faire un mot entier ne remplacer que dans VB, mais qu'en est-il de la commande DOS? Est-ce impossible? La même chose au cas de signe égal?


Si vous souhaitez seulement remplacer des mots entiers, le script de lot n'est pas une bonne option. Il peut être approché, mais vous serez bien mieux en utilisant quelque chose qui prend en charge la recherche de regex et remplacer, tels que VBScript.


Oui. Je vois. Merci de me diriger vers les langues appropriées.


"Peut-être que j'ai besoin d'aborder VBScript, VB ou C #. Il semble qu'ils sont une version avancée de la commande DOS." +1 pour "C # est une version avancée de la commande DOS" ...



1
votes

Pourquoi ne pas utiliser Edlin? Je n'ai pas trouvé de moyen de le faire avec un fichier initial et aucune erreur d'Edlin, mais ne les ignorez pas avec NUL:. Étranglier, le type% 0 inclut le fichier entier même s'il y a une fin du caractère de fichier entre le = et!, À l'aide de type sur le fichier de commandes après son exécution ne fonctionnera pas de la même manière.

@ECHO OFF
GOTO skip
1,1r=!
e
:skip

SET "new==old============="

ECHO %new% > %TEMP%\var.tmp
TYPE %0 > %TEMP%\edlin.tmp

EDLIN %TEMP%\var.tmp < %TEMP%\edlin.tmp > NUL:

SET /P newnew=<%TEMP%\VAR.TMP
ECHO %newnew%

ERASE %TEMP%\VAR.TMP
ERASE %TEMP%\VAR.BAK
ERASE %TEMP%\edlin.tmp


1 commentaires

Le caractère fin du fichier a été supprimé lorsque j'ai posté. Il devrait être entre le = et! sur la troisième ligne.



-1
votes

Ma réponse d'un autre poste, mais elle s'applique aussi ici:

Il y a une alternative plus facile. Au lieu de passer une valeur qui contient un signe égal, essayez plutôt quelque chose comme un colon à la place. Ensuite, grâce à la possibilité de modifier cette valeur (le côlon), vous pouvez le convertir dans un égal. Voici un exemple: p> xxx pré>

Lorsque vous exécutez le fichier de commandes, appelez-le comme ceci: p> xxx pré>

la sortie serait Soyez: P>

param = "some name:another value"
base  = some name:another value
pair  = some name=another value
name  = some name
value = another value


0 commentaires

2
votes

mise à jour : la dernière version des scripts est ici: https: // sf. NET / P / PENSOULS (scripts ici: https://sf.net/p/contools/contools/head/tree/trunk/scripts/tools/std/ )

Vous pouvez utiliser une séquence pour remplacer temporairement les caractères spéciaux par des espaces réservés? 00 ,? 01 ,? 02 et? 03. J'utilise essentiellement ces séries de scripts:

rempla_sys_chars.bat: xxx

restaore_sys_chars.bat: xxx

Exemple: xxx

test.txt: xxx

résultat: xxx

fonctionnalités :

  • Vous pouvez continuer à utiliser l'arithmétique variable par lots standard entre les conversions
  • Vous pouvez utiliser les espaces réservés de caractères (? 00 ,? 01 ,? 02 ,? 03) comme des valeurs variables simples

0 commentaires

7
votes

Je viens de créer une solution simple pour cela moi-même, peut-être que cela aide quelqu'un.

L'inconvénient (ou avantage dépend de ce que vous voulez faire) est-ce que plusieurs signes égaux l'un après l'autre sont manipulés comme un seul signe égal . (Exemple: "str == ING" donne la même sortie que "str = ing") p> xxx pré>

Comme vous l'avez vu, vous utilisez la fonction comme ceci: p >

call :replaceEqualSign in variableName with newString


0 commentaires

0
votes

Je cherchais cela, parce que j'avais besoin de me débarrasser = dans une chaîne comme "Test = Goon" J'ai constaté que appeler un prochain batchfile avec Test = Goon comme paramètres, j'ai des paramètres 1, "Test" et 2, "Ginkon", dans ce lotfile.

Ainsi: Batchfile 1: p>

arg1: test
arg2: goingon


0 commentaires