Supprimer des guillemets doubles de variables dans un 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 devis des variables de lot?

J’ai écrit un fichier de commandes qui importe avec succès une liste de parameters% 1,% 2,% 3 etc. et les place dans des variables nommées. Certains de ces parameters 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.% FirstName%
echo.% LastName%
echo.% ShipAddr%

les résultats s’affichent comme

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

Je dois éliminer les citations incluses sur les variables sélectionnées. Par exemple, FirstName et LastName sont utilisés ailleurs et ne doivent pas inclure de guillemets.

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

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

Je pensais avoir la solution, mais j’ai rapidement constaté un comportement inhabituel avec l’exécution de fichiers de commandes. Tout à coup, CMD ne reconnaît pas les états à long chemin. Exécution normale du fichier batch à 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% 1% 2 …% n à venir ait provoqué des changements. Certaines variables d’environnement ont peut-être été modifiées?

J’ai également essayé de supprimer les guillemets de la variable avec diverses tentatives utilisant la commande FOR. Cela semble gênant et j’ai été incapable d’apprendre comment y parvenir 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 que j’ai deux problèmes.

1) Mon idée «courte et douce» d’insérer ~ tilde dans les variables% 1% 2 entrantes (% ~ 1, etc.) semble avoir affecté certains parameters et modifié la façon dont CMD navigue dans les chemins longs.

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

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

edit 26/12/2009 13:36 PST entier fichier batch:

Blockquote
:: dataout.bat
:: revision 12/25/2009 Ajoutez ~ tilde aux% de variables entrantes pour éliminer les “guillemets” incorporés.
:: écrit la liste d’adresses en utilisant les parameters de ligne de commande
:: écrit la liste de sortie pour l’importation QBooks IIF
:: écrit les données de commande du commerçant pour RUI
:: exemple de chaîne de ligne de commande pour le test
:: listmail [firstname] [lastname] [“address ssortingng”] [“city ssortingng”] [état] [zip] [N ° de commande] [PurchDate] [Regname] [“FirstName Last”] [TransactionID] [PaymentMethod] [ Total] [ProductID] [Qté] [Price_Each] [PackPrep] [Livraison] [CommissionPmt] [Facture #]
:: exemple: dataout Bellewinkle Moose “123 Voie verte” “Vancouver” WA 98664 1004968 05/25/2009 “Bellewinkle Moose” “Olive Oyl” 101738 “En compte” 20.67 FK-1P 1 8.95 3.00 1.39 239
@Écho off
cls
c:
CD\
cd documents and settings \ administrateur \ mes documents \ txt \ batchtest
traitement de l’écho% 1% 2
: VARISET
:: Convertir les parameters de la ligne de commande% n en variables de 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
set ($ Total) =% ~ 9
shift set ($ 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
définir _ShipCombName =% ($ FirstName)%% ($ LastName)%
nom de combo echo ship est% _ShipCombName%
pause
:: ecrit la chaine varibables en logfile
echo FN% ($ FirstName)% LN% ($ LastName)% BA% ($ BillingAddress1)%% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)%% ($ OrderNumber)%% ($ Purch_Date )%% ($ RegistrationName)%% ($ TransactionID)%% ($ PaymentMethod)%% ($ Total)%% ($ ProductIdentifier)%% ($ Quantity)%% ($ Price_Each)%% ($ Pack_Prep)% % ($ Shipping)%% ($ ServiceFee)%% ($ Discount)%% ($ Invoice)%% ($ UnitPrice)%% _ShipCombName% >> d_out_log.txt
:: Atsortingbuer un compte par fournisseur de services
IF / i% ($ PaymentMethod)% == Amazon Receivables SET _QBAcct = Amazon.com
:: 25-12-2009 ajout d’une 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
IF / i% ($ PaymentMethod)% == PayPal SET _QBAcct = PayPalPmts
IF / i% ($ PaymentMethod)% == Sur le compte SET _QBAcct =% ($ RegistrationName)%
IF / i% ($ PaymentMethod)% == Courrier SET _QBAcct =% ($ RegistrationName)%
IF / i% ($ PaymentMethod)% == AMER SET _QBAcct = Auth / Net
IF / i% ($ PaymentMethod)% == DISC SET _QBAcct = Auth / Net
:: Assigner un désignateur Rep basé sur QBAccount
IF / i% ($ PaymentMethod)% == Amazon Receivables SET _Rep = Amazon
:: 25-12-2009 ajout d’une 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
IF / i% ($ PaymentMethod)% == Visa SET _Rep = BlueZap
IF / i% ($ PaymentMethod)% == PayPal SET _Rep = BlueZap
IF / i% ($ PaymentMethod)% == Sur le compte SET _Rep = RB
IF / i% ($ PaymentMethod)% == Mail SET _Rep = RB
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 adresse fichier écrit
: ADDRFOUND
echo sélectionné rep est% _Rep%
Le compte echo sélectionné est:% _QBAcct%
pause
:: RUI OUT
:: écrire l’identifiant de la commande du commerçant et l’identifiant de la commande RUI à l’IUR
:: 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% ($ Invoice)%% ($ OrderNumber)% >> writeRUI.txt
:: end write RUI
:: IIF OUT
: IIFWRITE
:: Vérifier 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
:: write Header, Ship / Handling, remise, données de rep & commission vers 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% (Remise $)% 1? >> writeIIF.txt
echo Comm% ($ ServiceFee)% 1? >> writeIIF.txt
: LINEWRITE
IF / i% ($ ProductIdentifier)% equ PH-1 goto WRITE_DEFA ELSE goto WRITE_DISC
echo% ($ ProductIdentifier)%
: WRITE_DISC
:: écrit des prix réduits analysés à partir d’une variable personnalisée:
echo% ($ ProductIdentifier)%% ($ Price_Each)%% ($ Quantité)%? >> writeIIF.txt
goto: EOF
: WRITE_DEFA
: écrit les prix par défaut analysés à partir des données du produit
echo% ($ ProductIdentifier)%% ($ UnitPrice)%% ($ Quantity)%? >> writeIIF.txt
goto: EOF
:: délai de 3 secondes
:: TYPE NUL | CHOICE.COM / N / CY / TY, 3> NUL
: EOF

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

Consortingbution:

 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 “World” (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 de commandes .cmd ou .bat et exécutez):

 @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, etc.

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

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

Par exemple:

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

Notez les guillemets autour de %cmd% . Sans eux, le chemin avec des espaces ne fonctionnera pas.

Si vous pouviez publier votre code de lot complet, une réponse plus spécifique pourrait être apscope.

J’ai passé beaucoup de temps à essayer de le faire d’une manière simple. Après avoir examiné attentivement la boucle FOR, j’ai réalisé 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 ssortingng" FOR /F "delims=" %%I IN (%Quoted%) DO SET Unquoted=%%I ECHO %Quoted% ECHO %Unquoted% 

Sortie:

 "Test ssortingng" Test ssortingng 

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

 set var=%var:"=% 

Et puis appliquez-les à nouveau partout où j’en ai besoin, par exemple:

 echo "%var%" 

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

J’ai appris de ce lien , si vous utilisez XP ou supérieur, cela fonctionnera tout seul:

SET params = %~1

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

Pour les parcourir, j’ai fait ceci:

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

Note: Vous obtiendrez uniquement des guillemets si vous passez des arguments séparés par un espace en général.

  1. set widget = “un élément très utile”
  2. définir le widget
  3. widget = “un object très utile”
  4. set widget =% widget: “=%”
  5. définir le widget
  6. set widget = un article très utile ”

La citation finale " à la ligne 4 ajoute une citation " à la chaîne. Il devrait être enlevé. La syntaxe de la ligne 4 se termine par %

Je pensais avoir la solution, mais j’ai rapidement constaté un comportement inhabituel avec l’exécution de fichiers de commandes. Tout à coup, CMD ne reconnaît pas les états à long chemin. Exécution normale du fichier batch à partir du chemin complet

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

résultats

“C: \ Documents” n’est pas reconnu en tant que 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 parameters à 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é.

 @echo off Setlocal enabledelayedexpansion Set 1=%1 Set 1=!1:"=! Echo !1! Echo "!1!" Set 1= 

Montre avec ou sans guillemets si les parameters d’origine ont des guillemets ou non.

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

Si ‘% 1’ == ” goto yoursub

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

Si EXIST “! 1!” goto othersub

Notez que l’utilisation de guillemets simples et de guillemets doubles est différente.

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

set FirstName =% ~ 1

set LastName =% ~ 2

Cette ligne aurait dû fonctionner, vous aviez besoin d’un petit changement.

définir “FirstName =% ~ 1”

définir “LastName =% ~ 2”

Inclure l’assignation complète entre guillemets. Il supprimera les guillemets sans problème. C’est un mode d’affectation préféré qui corrige les problèmes indésirables avec des citations dans les arguments.