135 votes

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 efficace et sûr moyen de l'éliminer, des citations de lot variables?

J'ai écrit un fichier de commandes qui réussit à l'importer une liste de paramètres %1, %2, %3, etc. et les place dans les variables nommées. Certains de ces paramètres contiennent plusieurs mots, et à cet effet, sont entourées de guillemets doubles.

> "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 echo.

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

affichage des résultats comme

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

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

Dans un test fichier de commandes, j'ai réussi à éliminer les devis en utilisant le ~tilde dans des variables.

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

Je pensais que j'avais la solution, mais j'ai vite connu un comportement inhabituel avec l'exécution de fichiers par lots. Soudain, CMD est pas reconnaissant long chemin relevés. Normal d'exécution du fichier de commandes à partir du chemin d'accès complet

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

retourne

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

Donc, il semblerait que l'ajout de la ~tilde à l'entrée %1 %2...%n variables a causé un peu de changement. Peut-être certaines variables d'environnement ont été modifiés?

J'ai aussi essayé de compensation des citations de l'intérieur variable avec diverses tentatives à l'aide de la commande FOR. Qui semble maladroit et j'ai été incapable d'apprendre comment accomplir cela par la création d'une liste de variable 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 questions.

1) Ma "short and sweet" l'idée de l'insertion ~tilde dans le entrantes %1 %2 variables (%~1, etc) semble avoir affecté certains paramètres et modifié la façon dont CMD navigue long des chemins d'accès.

2) je suis toujours à la recherche d'un moyen propre à éliminer les citations de sélectionné les variables nommées.

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

edit 12/26/2009 13:36 PST ensemble de fichier batch:

Blockquote
:: dataout.chauve-souris
:: révision 12/25/2009 ajouter ~tilde à la réception d' %variables à éliminer intégré "entre guillemets.
:: écrit à la liste d'adresses à l'aide de paramètres de ligne de commande
:: écrit les données de sortie de liste pour QBooks IIF importation
:: écrit Marchand de données de Commande pour RUI
:: exemple de chaîne de ligne de commande 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\administrateur\mes documents\txt\batchtest
echo de traitement %1 %2
:VARISET
:: Convertir %n paramètres de ligne de commande pour les variables de chaîne
set ($Prenom)=%~1
set ($Nom)=%~2
set ($BillingAddress1)=%~3
set ($BillingCity)=%~4
set ($BillingState)=%~5
set ($BillingPostal)=%~6
set ($OrderNumber)=%~7
set ($Purch_Date)=%~8
set ($RegistrationName)=%~9
maj
set ($TransactionID)=%~9
maj
set ($PaymentMethod)=%~9
maj
set ($Total)=%~9
maj set ($ProductIdentifier)=%~9
maj
set ($Quantite)=%~9
maj
set ($Price_Each)=%~9
maj
set ($Pack_Prep)=%~9
maj
set ($frais d'Expédition)=%~9
maj
set ($ServiceFee)=%~9
maj
set ($de Rabais)=%~9
maj
set ($Facture)=%~9
maj
set ($prix unitaire)=%~9
ensemble _ShipCombName=%($Prenom)% %($LastName)%
echo navire de liste déroulante nom est %_ShipCombName%
pause
:: écrire chaîne varibables à logfile
echo FN %($Prenom)% LN %($LastName)% BA %($BillingAddress1)% %($BillingCity)% %($BillingState)% %($BillingPostal)% %($OrderNumber)% %($Purch_Date)% %($RegistrationName)% %($TransactionID)% %($PaymentMethod)% %($Total)% %($ProductIdentifier)% %(Quantité de$)% %($Price_Each)% %($Pack_Prep)% %($Frais d'expédition)% %($ServiceFee)% %($de Rabais)% %($Facture)% %($prix unitaire)% %_ShipCombName% >> d_out_log.txt
:: Attribuer Compte par le Fournisseur de Service
IF /i %($PaymentMethod)%==Amazon Créances ENSEMBLE _QBAcct=Amazon.com
:: 12-25-2009 ajouté deuxième Amazon pm pas de méthode pour plus de polyvalence
IF /i %($PaymentMethod)%==Amazon JEU _QBAcct=Amazon.com
IF /i %($PaymentMethod)%==MÂT ENSEMBLE _QBAcct=Auth/Net
IF /i %($PaymentMethod)%==MasterCard ENSEMBLE _QBAcct=Auth/Net
IF /i %($PaymentMethod)%==Visa ENSEMBLE _QBAcct=Auth/Net
IF /i %($PaymentMethod)%==établies PayPal _QBAcct=PayPalPmts
IF /i %($PaymentMethod)%==Sur le Compte _QBAcct=%($RegistrationName)%
IF /i %($PaymentMethod)%==Mail ENSEMBLE _QBAcct=%($RegistrationName)%
IF /i %($PaymentMethod)%==AMER ENSEMBLE _QBAcct=Auth/Net
IF /i %($PaymentMethod)%==DISC SET _QBAcct=Auth/Net
:: Attribuer Rep désignation fondée sur QBAccount
IF /i %($PaymentMethod)%==Amazon Créances ENSEMBLE _Rep=Amazon
:: 12-25-2009 ajouté deuxième Amazon pm pas de méthode pour plus de polyvalence
IF /i %($PaymentMethod)%==Amazon JEU _Rep=Amazon
IF /i %($PaymentMethod)%==MÂT ENSEMBLE _Rep=BlueZap
IF /i %($PaymentMethod)%==MasterCard ENSEMBLE _Rep=BlueZap
IF /i %($PaymentMethod)%==Visa ENSEMBLE _Rep=BlueZap
IF /i %($PaymentMethod)%==établies PayPal _Rep=BlueZap
IF /i %($PaymentMethod)%==Sur le Compte _Rep=R B
IF /i %($PaymentMethod)%==Mail ENSEMBLE _Rep=R B
IF /i %($PaymentMethod)%==AMER ENSEMBLE _Rep=BlueZap
IF /i %($PaymentMethod)%==DISC SET _Rep=BlueZap
:: check pour dupliquer les données d'adresse
findstr /i /s "%_ShipCombName%" addrlist.txt
echo errorlevel: %errorlevel%
if errorlevel 1 goto :ADDRWRITE
si errorlevel 0 goto :ADDRFOUND
:ADDRWRITE
echo %_ShipCombName% >> addrlist.txt
echo %($BillingAddress1)% >> addrlist.txt
echo %($BillingCity)% %($BillingState)% %($BillingPostal)% >> addrlist.txt
l'écho. >> addrlist.txt
echo Fichier d'Adresses Écrit
:ADDRFOUND
echo sélectionné rep est %_Rep%
echo compte sélectionné est: %_QBAcct%
pause
:: RUI OUT
:: write Marchand Ordre d'ID & RUI numéro de Commande à RUI
:: vérification des doublons RUI données dans writeRUI.txt
cd..
cd RegKOut
find /i "%($OrderNumber)%" writeRUI.txt
echo errorlevel: %errorlevel%
if errorlevel 1 goto :RUIWRITE
si errorlevel 0 goto :IIFWRITE
:RUIWRITE
echo %($Facture)% %($OrderNumber)% >> writeRUI.txt
:: fin d'écriture RUI
:: IIF OUT
:IIFWRITE
:: Check pour dupliquer les données de facturation dans writeIIF.txt
find /i "%($OrderNumber)%" writeIIF.txt
echo errorlevel: %errorlevel%
if errorlevel 1 goto :HEADWRITE
si errorlevel 0 goto :LINEWRITE
:HEADWRITE
:: write-Tête, Navire/de Manutention, d'actualisation, Rep & données de la commission de 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 %($frais d'Expédition)% 1 ? >> writeIIF.txt
echo DISQUE %($de Rabais)% 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
::les écritures des prix remisé analysés à partir de la variable personnalisée:
echo %($ProductIdentifier)% %($Price_Each)% %(Quantité de$)% ? >> writeIIF.txt
goto :EOF
:WRITE_DEFA
:écrit par défaut de prix analysés à partir de données du Produit
echo %($ProductIdentifier)% %($prix unitaire)% %(Quantité de$)% ? >> writeIIF.txt
goto :EOF
:: 3 secondes de retard
:: TYPE NUL | CHOICE.COM /N /CY /TY,3 >NUL
:EOF

224voto

Mr. Rick Points 630

@BobB

Vous avez un supplément de double citation à la fin, qui est de l'ajouter de nouveau à la fin de la chaîne (après avoir retiré les deux citations à partir de la chaîne).

Entrée:

définir widget="un item très utile"
définir widget
définir widget=%widget:"=%
définir widget

Sortie:

widget="un item très utile"
widget=un item très utile

Remarque: Pour remplacer des Guillemets Doubles "avec des Guillemets Simples' effectuer les opérations suivantes:

définir widget=%widget:"='%

Remarque: Pour remplacer le mot "Monde" (non sensible à la casse) BobB effectuer les opérations suivantes:

définir widget="Bonjour le Monde!"
définir widget=%widget:monde=BobB%
définir widget

Sortie:

widget="Bonjour BobB!"

En ce qui concerne votre question initiale va (enregistrez le code suivant dans un fichier de commandes .cmd ou .chauve-souris et la course):

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

Sortie:

"C:\Users\Test\Documents\Batch Files\Supprimer Les Guillemets.cmd"
C:\Users\Test\Documents\Fichiers Batch\Supprimer Les Guillemets.cmd
"C:\Users\Test\Documents\Batch Files\Supprimer Les Guillemets.cmd"
C:\Users\Test\Documents\Fichiers Batch\Supprimer Les Guillemets.cmd
"C:\Users\Test\Documents\Batch Files\Supprimer Les Guillemets.cmd"
Appuyez sur n'importe quelle touche pour continuer . . .

%0 est le Nom du Script et le Chemin d'accès.
%1 est le premier argument de ligne de commande, et ainsi de suite.

46voto

atzz Points 7215

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 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, les chemins avec des espaces ne fonctionneront pas.

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

16voto

t1ck Points 9

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

set var =% var: "=%

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

echo "% var%"

10voto

Vitaliy Ulantikov Points 2834

J'ai passé beaucoup de temps à essayer de le faire de 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 string"

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

ECHO %Quoted%
ECHO %Unquoted%
 

Sortie:

 "Test string"
Test string
 

3voto

John Knoeller Points 20754

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X