Comment avez-vous bande de citations de l'ÉCHO ed chaîne de caractères dans un fichier de commandes Windows?
J'ai un fichier de commandes Windows, je suis de la création, mais je dois faire l'ÉCHO d'une grande chaîne complexe, donc je vais devoir mettre des guillemets à chaque extrémité. Le problème est que les guillemets sont également fait l'Écho pour le fichier je vais écrire à. Comment avez-vous l'ÉCHO d'une chaîne comme ça et bande les citations hors tension?
Mise à JOUR:
J'ai passé les deux derniers jours de travail sur ce sujet et finalement, il a pu faire quelque chose de quelque chose ensemble. Richard réponse travaillé à dépouiller les guillemets, mais même quand je mets l'ÉCHO dans la sous-routine et directement en sortie de la chaîne, Windows reste encore accroché sur les caractères dans la chaîne. Je vais accepter la réponse de Richard, car il répond à la question posée.
J'ai fini à l'aide de Greg sed solution, mais eu à le modifier en raison de sed/windows bugs/fonctionnalités (il n'a pas l'aide qu'il est venu en l'absence de documents). Il ya quelques mises en garde à l'aide de sed dans Windows: vous devez utiliser des guillemets au lieu de guillemets simples, vous ne pouvez pas échapper les guillemets dans la chaîne directement, vous devez endquote de la chaîne, de s'échapper à l'aide de l' ^ (donc ^") alors beqin devis pour la section suivante. Aussi, quelqu'un a fait remarquer que si vous avez de la pipe d'entrée à sed, il y a un bug avec un tuyau dans la chaîne (je n'ai pas pu le vérifier car lors de ma dernière solution, j'ai juste trouvé un moyen de ne pas avoir toutes les citations dans le milieu de la chaîne, et juste enlevé toutes les citations, je n'ai jamais pu obtenir le endquote d'être enlevé par lui-même.) Merci pour toute l'aide.
Vous devez vous connecter pour publier un commentaire.
L'appel de la commande a cette fonctionnalité intégrée. Pour citer l'aide de l'appel:
Ici est une primitive exemple:
De sortie:
Je devrais crédit de la "variable d'environnement tunneling' technique (endlocal&set ret=%thestring%) de Tim Hill, "Windows NT Shell Scripting". C'est le seul livre que j'ai jamais trouvé que les adresses des fichiers batch avec toute la profondeur.
Vous pouvez utiliser le
%var:x=y%
de la construction, qui remplace tousx
avecy
.Voir cet exemple ce qu'il peut faire:
L'approche suivante peut être utilisée pour imprimer une chaîne de caractères sans les guillemets:
Pour supprimer tous les guillemets à partir d'un ensemble de variables, vous avez besoin d'Expansion Retardée de Variables de façon sécurisée élargir la variable et de la traiter. L'Expansion à l'aide de signes de pourcentage (c'est à dire
%VAR%
et%1
) sont intrinsèquement dangereux (ils sont vulnérables à la commande d'injection; lire ceci pour plus de détails).À la bande de citations à partir d'un fichier texte ou d'une sortie de commande, les choses vont se compliquer car, avec l'Expansion Retardée, la chaîne
!VAR!
dans le document texte obtiendrez élargi (au sein de la%%i
expansion dansFOR /F
) quand il ne devrait pas. (C'est une autre vulnérabilité de divulgation d'informations—qui n'est pas documentée ailleurs.)En toute sécurité de parser le document, un commutateur entre retardée d'extension activé et désactivé de l'environnement est nécessaire.
La
delims^=^ eol^=
dans le code ci-dessus a probablement besoin d'explication:Cela permet de désactiver les deux "delims" des personnages (c'est à dire séparateurs de champ) et "fin de vie" (à savoir que caractère de commentaire). Sans elle, la "delims" sera, par défaut, à onglet et de l'espace et de la "fin de vie" par défaut, un point-virgule.
eol=
jeton de toujours lire quel que soit le caractère suivant c'est après le signe égal. Pour désactiver ce jeton doit être à la fin de la chaîne d'options de sorte qu'aucun caractère ne peut être utilisé pour "eol", effectivement en le désactivant. Si la chaîne d'options est cité, il peut utiliser les guillemets (") comme la "fin de vie", donc il ne faut pas citer la chaîne d'options.delims=
option, lorsqu'elle n'est pas la dernière option dans les options de la chaîne, sera terminé par un espace. (Pour inclure l'espace dans "delims" il doit être la dernière option deFOR /F
options.) Doncdelims=
suivi d'un espace puis une autre option désactive le "delims".Ce
"C:\Program Files\somefile.txt"
enC:\Program Files\somefile.txt
tout en préservant les cas comme
Height=5'6"
etSymbols="!@#
Exemple
La réponse ci-dessus (en commençant par :DeQuote) suppose retardé l'expansion des variables d'environnement est définie sur on. Cmd /?:
Retardé l'expansion des variables d'environnement n'est PAS activé par défaut. Vous
pouvez activer ou désactiver retardé l'expansion des variables d'environnement pour un
particulier invocation de CMD.EXE avec le /V:SUR ou /V:OFF. Vous
pouvez activer ou désactiver la fin pour toutes les invocations de CMD.EXE sur un
machine et/ou de l'utilisateur d'ouverture de session de la session par la définition de l'une ou des deux
suivant REG_DWORD valeurs dans le registre à l'aide de REGEDT32.EXE:
à la valeur 0x1 ou 0x0. L'utilisateur paramètre spécifique l'emporte sur
le paramètre de la machine. Les commutateurs de ligne de commande prévalent sur les
les paramètres du registre.
Si le retard expansion des variables d'environnement est activée, le point d'exclamation
caractère qui peut être utilisé pour remplacer la valeur d'une variable d'environnement
au moment de l'exécution.
Le fichier de commandes suivant démarre une série de programmes avec un temps de retard après chacun d'eux.
Le problème est de passer d'une ligne de commande avec les paramètres de chaque programme. Cela nécessite des guillemets autour du programme de l'argument, qui sont supprimés lorsque l'appel est effectué. Cela illustre un peu les techniques de traitement des fichiers de commandes.
Regarder dans les locaux de la sous-routine :mystart pour comment un argument entre guillemets est passé, et les citations sont supprimés.
Je sais qu'il n'est pas fait pour l'auteur, mais si vous avez besoin d'envoyer du texte le fichier sans les guillemets - la solution ci-dessous fonctionne pour moi. Vous n'avez pas besoin d'utiliser des guillemets dans l'écho de commande, il suffit d'entourer la commande complète avec des crochets.
À l'aide de la commande à la bande entourant de guillemets est le moyen le plus efficace que j'ai trouvé pour ce faire. Dans la forme compacte (Exemple 2) c'est un one-liner.
Exemple 1: Le 5-ligne (en commentaire) solution.
Exemple 2: 1-liner dans le monde réel exemple.
Je trouve intéressant que l'intérieur de l'écho ignore la redirection de caractères '<' et '>'.
Si vous exécutez
ECHO asdfsd>asdfasd
vous permettra d'écrire le fichier au lieu de std out.Espère que cela aide 🙂
Edit:
Je l'ai pensé et réalisé il y a un encore plus facile (et moins hacky) manière d'accomplir la même chose. Utiliser le renforcement de la substitution de variable/expansion (voir
HELP SET
) comme ceci:Qui imprime tous, mais le premier et le dernier caractère (votre guillemets). Je vous conseille d'utiliser
SETLOCAL ENABLEDELAYEDEXPANSION
trop. Si vous avez besoin de comprendre d'où les guillemets sont situés dans la chaîne de caractères que vous pouvez utiliser FINDSTR pour obtenir le caractère #s.Daniel Budzyński la réponse est génial. Il fonctionne même dans les situations où il y a des caractères spéciaux dans la sortie. Par exemple:
Si vous essayez essayé de faire un simple echo sans les guillemets, vous obtenez une erreur, en raison de la "<" dans la variable:
La force Brute de la méthode:
Cela nécessite de trouver un bon Win32 version de
sed
, bien sûr.http://unxutils.sourceforge.net/ est un natif win32 port d'un tas d'utilitaires GNU, y compris sed, gawk, grep et wget. (désolé que je n'ai pas assez de rep à la poste comme un commentaire!)