La suppression des guillemets doubles des variables dans le fichier batch crée des problèmes avec L'environnement CMD

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

J'ai écrit un fichier batch 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 par conséquent sont entourés de guillemets doubles.

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

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

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

La vérification des variables se fait par echo.

Echo.%FirstName %
echo.%LastName %
echo.% ShipAddr %

Les résultats s'affichent comme

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

J'ai besoin d'éliminer les guillemets inclus 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 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 connu un comportement inhabituel avec l'exécution de les fichiers batch. Soudainement, CMD ne reconnaît pas les états de chemin long. Exécution normale du fichier batch à partir du chemin complet

> C:Documents and SettingsAdministratorMy DocumentsTxtbatchtestdataout.bat

Renvoie

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

Il semblerait donc que l'ajout du caractère ~ tilde à l'entrée %1% 2...% n variables a provoqué des changements. Peut-être que certaines variables d'environnement ont été modifiées?

J'ai également essayé d'Effacer les guillemets de la variable avec diverses tentatives en utilisant la commande FOR. Cela semble maladroit et j'ai été incapable d'apprendre comment pour ce faire, en créant une liste de variables pour effectuer la tâche:

Quelque Chose comme ceci:

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 entrantes %1% 2 (%~1, etc.) semble avoir affecté certains paramètres et modifié la façon dont CMD navigue dans les noms de chemin longs.

2) je suis toujours à la recherche d'un moyen propre et facile d'éliminer les guillemets des variables nommées sélectionnées.

Toute aide pour les plus expérimentés seraient appréciés. Je suis au bout de mes compétences ici... besoin de conseils s'il vous plaît!

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

Blockquote
:: dataout.MTD
:: révision 12/25/2009 ajouter ~ tilde aux variables % entrantes pour éliminer les "guillemets" intégrés.
:: écrit la liste d'adresses en utilisant les paramètres de ligne de commande
:: écrit la liste de sortie de données pour qbooks IIF import
:: écrit les données de commande marchand pour RUI
:: exemple de commande chaîne de ligne pour tester
:: listmail[prénom][nom] [adresse"chaîne de caractères"]["ville"chaîne][etat][code postal][No][PurchDate][Regname]["Prénom Nom"][TransactionID][PaymentMethod][Total][Id_produit][Qty][Price_Each][PackPrep] [Expédition] [CommissionPmt] [no de Facture]
:: exemple: dataout Bellewinkle l'Orignal "123 le Vert de la Forêt Chemin", "Vancouver" WA 98664 1004968 05/25/2009 "Bellewinkle l'Orignal" "Olive Oyl" 101738 "Sur le Compte" 20.67 FK-1P 1 8.95 3.00 1.39 239
@ echo off
cls
c:
cd
CD documents and settings administrator Mes documents TXTbatchtest
traitement d'écho %1% 2
: VARISET
:: Convertir %n Paramètres de ligne de commande en variables de chaîne
set ($Prenom)=%~1
set ($Nom)=%~2
set ($BillingAddress1)= % ~ 3
ensemble ($BillingCity)= % ~ 4
définir ($BillingState)= % ~ 5
ensemble ($BillingPostal)= % ~ 6
set ($OrderNumber)= % ~ 7
set ($Purch_Date)= % ~ 8
définir ($RegistrationName)=% ~ 9
maj
set ($TransactionID)= % ~ 9
maj
ensemble ($PaymentMethod) = % ~ 9
maj
ensemble ($Total) = % ~ 9
changement set ($ProductIdentifier)=% ~ 9
maj
ensemble ($Quantité) = %~9
maj
ensemble ($Price_Each)=% ~ 9
maj
set ($Pack_Prep)=% ~ 9
maj
ensemble ($gratuite)= % ~9
maj
set ($ServiceFee)=% ~ 9
maj
ensemble ($Discount)= % ~9
maj
définir ($Facture)=% ~ 9
maj
ensemble ($UnitPrice)= % ~ 9
ensemble _ShipCombName=%($Prenom)% %($LastName)%
le nom du combo echo ship est %_ShipCombName %
pause
:: écrire des variables de chaîne dans le fichier journal
echo FN %($Prenom)% LN %($LastName)% BA %($BillingAddress1)% %($BillingCity)% %($BillingState)% %($BillingPostal)% %($OrderNumber)% %($Purch_Date)% %($RegistrationName)% %($TransactionID)% %($PaymentMethod)% %($Total)% %($ProductIdentifier)% %($Quantité)% %($Price_Each)% %($Pack_Prep)% %($frais d'Expédition)% %($ServiceFee)% %($de Rabais)% %($Facture)% %($prix unitaire)% %_ShipCombName% >> d_out_log.txt
:: Attribuer un compte par fournisseur de services
Si / i %($PaymentMethod)% = = ensemble de créances Amazon _QBAcct=Amazon.com
:: 12-25-2009 ajout de la deuxième méthode Amazon pm'T pour la polyvalence
Si / i %($PaymentMethod)%==ensemble Amazon _QBAcct=Amazon.com
Si / i %($PaymentMethod)%= = MAST SET _QBAcct=Auth / Net
Si / i %($PaymentMethod) % = = MasterCard Définir _QBAcct = Auth / Net
Si / i %($PaymentMethod)% = = Visa SET _QBAcct = Auth / Net
Si / i %($PaymentMethod)%==SET PayPal _QBACCT=PayPalPmts
Si / i %($PaymentMethod)%= = sur le jeu de Compte _QBAcct=%($RegistrationName)%
Si /i %($PaymentMethod)%= = Mail SET _QBAcct=%($RegistrationName)%
Si / i %($PaymentMethod) % = = amer SET _QBAcct=Auth / Net
Si / i %($PaymentMethod)%= = jeu de disques _QBAcct = Auth / Net
:: Attribuer un désignateur Rep basé sur QBAccount
Si / i %($PaymentMethod)% = = ensemble de créances Amazon _REP = Amazon
:: 12-25-2009 ajout de la deuxième méthode Amazon pm'T pour la polyvalence
Si / i %($PaymentMethod)%==Amazon SET _REP = Amazon
Si / i %($PaymentMethod)%= = MAST SET _Rep = BlueZap
Si / i %($PaymentMethod)% = = ensemble MasterCard _REP = BlueZap
Si / je %($PaymentMethod)% = = Visa SET _Rep = BlueZap
Si / i %($PaymentMethod)%==PayPal SET _Rep = BlueZap
Si / i %($PaymentMethod)%==sur le compte SET _Rep=R B
Si / i %($PaymentMethod)%==Mail SET _Rep=R B
Si / i %($PaymentMethod)% = = amer SET _REP = BlueZap
Si / i %($PaymentMethod)% = = jeu de disques _Rep = BlueZap
:: vérifier les données d'adresse 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
echo. > > addrlist.txt
fichier d'adresse echo écrit
: ADDRFOUND
echo rep sélectionné est %_Rep %
echo compte sélectionné est: %_QBAcct %
pause
:: RUI OUT
:: écrire marchand ordre ID & Rui ordre ID à RUI
:: vérifiez les données Rui en double dans writeRUI.txt
CD..
cd RegKOut
trouver / i "%($OrderNumber)%" writeRUI.txt
echo errorlevel: % errorlevel %
si errorlevel 1 goto: RUIWRITE
si errorlevel 0 goto: IIFWRITE
: RUIWRITE
echo %($Facture)% %($OrderNumber)% >> writeRUI.txt
:: fin écrire RUI
:: IIF OUT
:IIFWRITE
:: Vérifiez les données de facture en double dans writeIIF.txt
trouver /i "%($OrderNumber)% " writeIIF.txt
echo errorlevel: % errorlevel %
si errorlevel 1 goto: HEADWRITE
si errorlevel 0 goto: LINEWRITE
:HEADWRITE
:: écrire En-tête, navire / manutention, remise, Rep & commission données à QB IIF fichier d'importation
echo %($OrderNumber)% %($Purch_Date)% de la Facture %($TransactionID)% %_QBAcct% des Comptes Débiteurs %($Total)% %_Rep% >> writeIIF.txt
echo H / P %($Pack_Prep) % 1 ? > > writeIIF.txt
echo SHP %($expédition) % 1 ? > > writeIIF.txt
echo DISQUE %($de Rabais)% 1 ? > > writeIIF.txt
echo Comm %($ServiceFee) % 1 ? > > writeIIF.txt
:LINEWRITE
Si /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é de$)% ? > > writeIIF.txt
goto: EOF
:WRITE_DEFA
: écrit les prix par défaut analysés à partir des données Produit
echo %($ProductIdentifier)% %($Prix Unitaire)% %(Quantité De$)% ? > > writeIIF.txt
goto: EOF
:: Délai de 3 secondes
:: TYPE NUL | CHOICE.COM /N / CY / TY,3 >NUL
:EOF

94
demandé sur BobB 2009-12-26 22:48:34

10 réponses

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

Entrée:

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:"='%

Note: 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 de commandes .cmd ou .bat et courir):

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

164
répondu Mr. Rick 2016-01-08 23:07:40

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 batch 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 poster votre code de lot entier, peut-être une réponse plus spécifique pourrait être faite.

31
répondu atzz 2009-12-26 20:10:36

Passé beaucoup de temps à essayer de le faire d'une manière simple. Après avoir regardé attentivement for loop, 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 string"

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

ECHO %Quoted%
ECHO %Unquoted%

Sortie:

"Test string"
Test string
8
répondu Vitaliy Ulantikov 2013-01-10 11:26:22

Je supprime généralement toutes les guillemets de mes variables avec:

set var=%var:"=%

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

echo "%var%"
8
répondu t1ck 2017-01-13 19:27:04

Cela ressemble à un simple bug où vous utilisez %~ quelque part où vous ne devriez pas être. L'utilisation si %~ ne change pas fondamentalement la façon dont les fichiers batch fonctionnent, il supprime simplement les guillemets de la chaîne dans cette situation unique.

3
répondu John Knoeller 2009-12-26 20:12:44

J'ai appris de ce lien , Si vous utilisez XP ou plus que cela fonctionnera simplement par lui-même:

SET params = %~1

Je ne pouvais pas obtenir l'une des autres solutions ici pour travailler sur Windows 7.

Pour itérer sur eux, j'ai fait ceci:

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

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

3
répondu 2013-04-01 17:27:21
  1. set widget = "un élément très utile"
  2. Définir le widget
  3. widget = "un élément très utile"
  4. définir widget=%widget:"=%"
  5. Définir le widget
  6. set widget = un élément très utile "

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

0
répondu David 2012-11-18 01:51:49

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

C:\Documents et paramètres \ administrateur \ Mes Documents \ TXT \ batchtest \ dataout.MTD

Renvoie

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

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

Et paramètres \ administrateur \ Mes Documents \ Txt\batchtest \ dataout.MTD

Comme paramètres du

"C:\Documents"

Programme.

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

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

Aurait fonctionné.

0
répondu CarryWise 2014-12-12 21:05:33
@echo off

Setlocal enabledelayedexpansion

Set 1=%1

Set 1=!1:"=!

Echo !1!

Echo "!1!"

Set 1=

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

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

If '% 1 '== " Aller à yoursub

Mais si vous vérifiez l'existence d'un fichier qui peut ou non avoir des guillemets, alors c'est:

S'il existe "!1!"goto othersub

Remarque l'utilisation de guillemets simples et de guillemets doubles est différente.

0
répondu Aaron Lowe 2016-03-25 00:05:51

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

Définir FirstName=% ~ 1

Définir LastName=% ~ 2

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

Définir "FirstName= % ~ 1"

Définir "LastName= % ~ 2"

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

0
répondu Code Name Jack 2017-09-18 19:13:33