web-dev-qa-db-fra.com

La suppression des guillemets des variables dans le fichier de commandes crée des problèmes avec l'environnement CMD

Quelqu'un peut-il aider avec un moyen efficace et sûr de supprimer les citations des variables de lot?

J'ai écrit un fichier de commandes qui importe avec succès une liste de paramètres% 1,% 2,% 3, etc. et les place dans des variables nommées. Certains de ces paramètres contiennent plusieurs mots et sont donc placés entre guillemets.

> "Susie Jo" (%1)  
> "Smith Barnes" (%2)  
> "123 E. Main St." (%3)  

Ces% variables sont ensuite placées dans des variables nommées:

> set FirstName=%1  
> set LastName=%2  
> set ShipAddr=%3  

la vérification des variables se fait par écho.

echo.% Prénom%
echo.% LastName%
echo.% ShipAddr%

les résultats s'affichent comme

"Susie Jo"  
"Smith Barnes"  
"123 E. Main St."  

J'ai besoin d'éliminer les citations incluses sur les variables sélectionnées. Par exemple, Prénom et Nom sont utilisés ailleurs et ne doivent pas inclure de guillemets.

Dans un fichier batch de test, j'ai réussi à éliminer les guillemets en utilisant le caractère ~ tilde dans les variables.

> set FirstName=%~1
> set LastName=%~2 

Je pensais avoir la solution, mais j'ai rapidement eu un comportement inhabituel lors de l'exécution de fichiers de traitement par lots. Soudain, CMD ne reconnaît pas les déclarations à long chemin. Exécution normale du fichier de commandes à partir du chemin complet

> C:\Documents and Settings\Administrator\My Documents\Txt\batchtest\dataout.bat

résultats

> 'C:\Documents' is not recognized as an internal or external command....

Il semblerait donc que l’ajout du caractère ~ tilde aux variables entrantes% 1% 2 ...% n ait provoqué certains changements. Peut-être que certaines variables d'environnement ont été modifiées?

J'ai également essayé d'effacer des guillemets dans une variable avec plusieurs tentatives en utilisant la commande FOR. Cela semble gênant et je n’ai pas pu apprendre comment faire cela en créant une liste de variables pour effectuer la tâche:

quelque chose comme ça:

for %%g in (%FirstName% %LastName%) do (
set %%g=%%~g
set %%h=%%~h
set FirstName=%%~g
set LastName=%%h
echo.%FirstName% %LastName%
)

Je pense avoir deux problèmes.

1) L'idée d'insérer ~ tilde dans les variables entrantes% 1% 2 (% ~ 1, etc.) 'semble avoir affecté certains paramètres et modifié la manière dont CMD navigue dans les noms de chemins longs.

2) Je suis toujours à la recherche d'un moyen simple et efficace pour éliminer les guillemets des variables nommées sélectionnées.

Toute aide pour les plus expérimentés serait la plus appréciée. Je suis à la fin de mes compétences ici ... besoin de conseils s'il vous plaît!

modifier 12/26/2009 13:36 Fichier batch complet PST:

Blockquote
:: dataout.bat
:: revision 12/25/2009 Ajoutez ~ tilde aux% variables entrantes pour éliminer les guillemets "incorporés".
:: écrit la liste d'adresses en utilisant des paramètres de ligne de commande
:: écrit la liste de sortie des données pour l'importation QBooks IIF
:: écrit les données de commande du marchand pour RUI
:: exemple de chaîne de ligne de commande à tester
] ] [Méthode de paiement] [Total] [ID produit] [Qté] [Prix_Chaque] [PackPrep] [Expédition] [CommissionPmt] [N ° de facture]
:: exemple: dataout Bellewinkle Moose "123 Green Forest Way" "Vancouver" WA 98664 1004968 25/05/2009 "Bellewinkle Moose" "Olive Oyl" 101738 "Sur le compte" 20.67 FK-1P 1 8.95 3.00 1.00 239
@Écho off
cls
c:
CD\
documents cd et paramètres\administrateur\mes documents\txt\batchtest
traitement de l'écho% 1% 2
: VARISET
:: Convertir les paramètres de ligne de commande% n en variables chaîne
set ($ FirstName) =% ~ 1
set ($ LastName) =% ~ 2
set ($ BillingAddress1) =% ~ 3
set ($ BillingCity) =% ~ 4
set ($ BillingState) =% ~ 5
set ($ BillingPostal) =% ~ 6
set ($ OrderNumber) =% ~ 7
set ($ Purch_Date) =% ~ 8
set ($ RegistrationName) =% ~ 9
décalage
set ($ TransactionID) =% ~ 9
décalage
set ($ PaymentMethod) =% ~ 9
décalage
ensemble ($ Total) =% ~ 9
jeu de décalage ($ ProductIdentifier) ​​=% ~ 9
décalage
set ($ Quantity) =% ~ 9
décalage
set ($ Price_Each) =% ~ 9
décalage
set ($ Pack_Prep) =% ~ 9
décalage
set ($ Shipping) =% ~ 9
décalage
set ($ ServiceFee) =% ~ 9
décalage
set ($ Discount) =% ~ 9
décalage
set ($ Invoice) =% ~ 9
décalage
set ($ UnitPrice) =% ~ 9
set _ShipCombName =% ($ FirstName)%% ($ LastName)%
Le nom du combo echo ship est% _ShipCombName%
pause
:: write string varibables dans le fichier journal
echo FN% ($ Prénom)% LN% ($ Nom)% BA% ($ BillingAddress1)%% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)%% ($ OrderNumber) %% ($ Purch_Date)%% ($ RegistrationName)%% ($ ID de transaction)%% ($ PaymentMethod)% ($ Total)%% ($ ProductIdentifier)%% ($ Quantité)%% ($ Price_Each)%% ($ Pack_Prep)%% ($ Expédition)%% ($ ServiceFee)%% ($ Remise)%% ($ Facture)%% ($ UnitPrice)%% _ShipCombName% >> d_out_log.txt
:: Attribuer un compte par fournisseur de services
IF/i% ($ PaymentMethod)% == Amazon Receivables SET _QBAcct = Amazon.com
:: 12-25-2009 ajouté deuxième méthode Amazon pm't pour la polyvalence
IF/i% ($ PaymentMethod)% == Amazon SET _QBAcct = Amazon.com
IF/i% ($ PaymentMethod)% == MAST SET _QBAcct = Auth/Net
IF/i% ($ PaymentMethod)% == MasterCard SET _QBAcct = Auth/Net
IF/i% ($ PaymentMethod)% == Visa SET _QBAcct = Auth/Net
SI/i% ($ PaymentMethod)% == Paypal SET _QBAcct = PayPalPmts
IF/i% ($ PaymentMethod)% == Sur le compte SET _QBAcct =% ($ RegistrationName)%
IF/i% ($ PaymentMethod)% == Mail SET _QBAcct =% ($ RegistrationName)%
IF/i% ($ PaymentMethod)% == AMER SET _QBAcct = Auth/Net
IF/i% ($ PaymentMethod)% == DISC SET _QBAcct = Auth/Net
:: Affecter un identifiant de représentant basé sur QBAccount
IF/i% ($ PaymentMethod)% == Amazon Receivables SET _Rep = Amazon
:: 12-25-2009 ajouté deuxième méthode Amazon pm't pour la polyvalence
IF/i% ($ PaymentMethod)% == Amazon SET _Rep = Amazon
IF/i% ($ PaymentMethod)% == MAST SET _Rep = BlueZap
IF/i% ($ PaymentMethod)% == MasterCard SET _Rep = BlueZap
SI/i% ($ PaymentMethod)% == Visa SET _Rep = BlueZap
IF/i% ($ PaymentMethod)% == Paypal SET _Rep = BlueZap
IF/i% ($ PaymentMethod)% == Sur le compte SET _Rep = R B
IF/i% ($ PaymentMethod)% == Mail SET _Rep = R B
IF/i% ($ PaymentMethod)% == AMER SET _Rep = BlueZap
IF/i% ($ PaymentMethod)% == DISC SET _Rep = BlueZap
:: vérifier les adresses en double
findstr/i/s "% _ShipCombName%" addrlist.txt
echo errorlevel:% errorlevel%
si errorlevel 1 goto: ADDRWRITE
si errorlevel 0 goto: ADDRFOUND
: ADDRWRITE
echo% _ShipCombName% >> addrlist.txt
echo% ($ BillingAddress1)% >> addrlist.txt
echo% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)% >> addrlist.txt
écho. >> addrlist.txt
echo Address File Written
: ADRESSES
echo rep sélectionné est% _Rep%
echo compte sélectionné est:% _QBAcct%
pause
:: RUI OUT
:: écrit l'ID de la commande du commerçant et l'ID de la commande RUI dans RUI
:: vérifier les données RUI en double dans writeRUI.txt
CD..
cd RegKOut
find/i "% ($ OrderNumber)%" writeRUI.txt
echo errorlevel:% errorlevel%
si errorlevel 1 goto: RUIWRITE
si errorlevel 0 goto: IIFWRITE
: RUIWRITE
echo% ($ Facture)%% ($ NuméroCommande)% >> writeRUI.txt
:: end write RUI
:: IIF OUT
: IIFWRITE
:: Vérifiez les données de facture en double dans writeIIF.txt
find/i "% ($ OrderNumber)%" writeIIF.txt
echo errorlevel:% errorlevel%
si errorlevel 1 goto: HEADWRITE
si errorlevel 0 goto: LINEWRITE
: HEADWRITE
:: écrire en-tête, navire/traitement, remise, données de représentation et de commission dans le fichier d'importation QB IIF
echo% ($ OrderNumber)%% ($ Purch_Date)% Facture% ($ TransactionID)%% _QBAcct% Comptes recevables% ($ Total)%% _Rep% >> writeIIF.txt
echo H/P% ($ Pack_Prep)% 1? >> writeIIF.txt
echo SHP% ($ Shipping)% 1? >> writeIIF.txt
echo DISC% ($ Discount)% 1? >> writeIIF.txt
echo Comm% ($ ServiceFee)% 1? >> writeIIF.txt
: LINEWRITE
IF/i% ($ ProductIdentifier)% equ PH-1 allez à WRITE_DEFA SINON allez à WRITE_DISC
echo% ($ ProductIdentifier)%
: WRITE_DISC
:: écrit les prix réduits analysés à partir de la variable personnalisée:
echo% ($ ProductIdentifier)%% ($ Price_Each)%% ($ Quantity)%? >> writeIIF.txt
goto: EOF
: WRITE_DEFA
: écrit les prix par défaut analysés à partir des données de produit
echo% ($ ProductIdentifier)%% ($ UnitPrice)%% ($ Quantity)%? >> writeIIF.txt
goto: EOF
:: délai de 3 secondes
:: TYPE NUL | CHOICE.COM/N/CY/TY, 3> NUL
: EOF

106
BobB

Vous avez un guillemet double supplémentaire à la fin, qui le rajoute à la fin de la chaîne (après avoir supprimé les deux guillemets de la chaîne).

Contribution:

set widget="a very useful item"
set widget
set widget=%widget:"=%
set widget

Sortie:

widget="a very useful item"
widget=a very useful item

Remarque: pour remplacer les "guillemets doubles" par des guillemets simples, procédez comme suit:

set widget=%widget:"='%

Remarque: pour remplacer le mot "Monde" (non sensible à la casse) par BobB, procédez comme suit:

set widget="Hello World!"
set widget=%widget:world=BobB%
set widget

Sortie:

widget="Hello BobB!"

En ce qui concerne votre question initiale (enregistrez le code suivant dans un fichier batch .cmd ou .bat et lancez-le):

@ECHO OFF
ECHO %0
SET BathFileAndPath=%~0
ECHO %BathFileAndPath%
ECHO "%BathFileAndPath%"
ECHO %~0
ECHO %0
PAUSE

Sortie:

"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"
C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd
"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"
C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd
"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"
Press any key to continue . . .

%0 est le nom et le chemin du script.
%1 est le premier argument de ligne de commande, et ainsi de suite.

182
Mr. Rick

Votre conclusion (1) semble fausse. Il doit y avoir un autre facteur en jeu.

Le problème des guillemets dans les paramètres du fichier de commandes est normalement résolu en supprimant les guillemets avec %~ puis remettez-les manuellement, le cas échéant.

Par exemple.:

set cmd=%~1
set params=%~2 %~3

"%cmd%" %params%

Notez les guillemets autour de %cmd%. Sans eux, les chemins avec des espaces ne fonctionneront pas.

Si vous pouviez publier votre code de lot complet, une réponse plus précise pourrait peut-être être fournie.

38
atzz

J'ai passé beaucoup de temps à essayer de le faire simplement. Après avoir examiné attentivement la boucle FOR, j'ai compris que je pouvais le faire avec une seule ligne de code:

FOR /F "delims=" %%I IN (%Quoted%) DO SET Unquoted=%%I

Exemple:

@ECHO OFF
SET Quoted="Test string"

FOR /F "delims=" %%I IN (%Quoted%) DO SET Unquoted=%%I

ECHO %Quoted%
ECHO %Unquoted%

Sortie:

"Test string"
Test string
9
Vitaliy Ulantikov

En général, je supprime simplement toutes les citations de mes variables avec:

set var=%var:"=%

Et ensuite, appliquez-les à nouveau où j'en ai besoin, par exemple:

echo "%var%"
8
t1ck

J'ai appris de ceci lien , si vous utilisez XP ou plus, que cela fonctionnera tout seul:

SET params = %~1

Je ne pouvais obtenir aucune des autres solutions ici pour fonctionner sur Windows 7.

Pour les parcourir, j'ai fait ceci:

FOR %%A IN (%params%) DO (    
   ECHO %%A    
)

Remarque: vous n'obtiendrez que des guillemets doubles si vous transmettez généralement des arguments séparés par un espace.

3
user195488

Cela ressemble à un simple bug où vous utilisez% ~ quelque part où vous ne devriez pas être. Si% ~ ne modifie pas fondamentalement le fonctionnement des fichiers de commandes, il supprime simplement les guillemets de la chaîne dans cette situation unique.

3
John Knoeller

Toutes les réponses sont complètes. Mais je voulais ajouter une chose,

set FirstName =% ~ 1

set LastName =% ~ 2

Cette ligne aurait dû fonctionner, il vous fallait un petit changement.

set "Prénom =% ~ 1"

set "LastName =% ~ 2"

Inclure la cession complète entre guillemets. Il va supprimer les guillemets sans problème. C’est une méthode d’affectation privilégiée qui résout les problèmes indésirables avec des guillemets dans les arguments.

0
Code Name Jack
@echo off

Setlocal enabledelayedexpansion

Set 1=%1

Set 1=!1:"=!

Echo !1!

Echo "!1!"

Set 1=

Démonstration avec ou sans guillemets sans indiquer si le paramètre d'origine a des guillemets ou non.

Et si vous voulez tester l’existence d’un paramètre qui peut ne pas être entre guillemets, mettez cette ligne avant les échos ci-dessus:

Si '% 1' == '' allez à votre sous-programme

Mais si la vérification de l’existence d’un fichier comportant ou non des guillemets, c’est:

Si EXIST "! 1!" aller à autre

Notez que l'utilisation des guillemets simples et des guillemets doubles est différente.

0
Aaron Lowe

Je pensais avoir la solution, mais j'ai rapidement eu un comportement inhabituel lors de l'exécution de fichiers de traitement par lots. Soudain, CMD ne reconnaît plus les déclarations à long chemin. Exécution normale du fichier de commandes à partir du chemin complet

C:\Documents and Settings\Administrateur\Mes documents\Txt\batchtest\dataout.bat

résultats

'C:\Documents' n'est pas reconnu comme une commande interne ou externe ....

Il y a tout ton problème. CMD ne comprend pas les espaces à l'intérieur des noms de fichiers à partir de la ligne de commande. Il pense donc que vous essayez de passer.

et Paramètres\Administrateur\Mes documents\Txt\batchtest\dataout.bat

comme paramètres de la

"C:\Documents"

programme.

Vous devez le citer pour exécuter un fichier de commandes avec des espaces dans le chemin:

> "C:\Documents and Settings\Administrator\My Documents\Txt\batchtest\dataout.bat"

aurait travaillé.

0
CarryWise
  1. set widget = "un élément très utile"
  2. définir le widget
  3. widget = "un élément très utile"
  4. set widget =% widget: "=%"
  5. définir le widget
  6. set widget = un élément très utile "

La citation suivante " à la ligne 4 ajoute un guillemet " à la chaîne. Il devrait être supprimé. La syntaxe de la ligne 4 se termine par %

0
David