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 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 sont par conséquent 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 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 lors de l'exécution de fichiers batch. Soudain, CMD ne reconnaît plus les instructions de long chemin. Exécution normale du fichier de commandes à partir du chemin complet
> C:\Documents and Settings\Administrator\My Documents\Txt\batchtest\dataout.bat
Retour
> '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 entraîné 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 gênant et je n'ai pas pu 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 entrantes% 1% 2 (% ~ 1, etc.) semble avoir affecté certains paramètres et modifié la façon dont CMD navigue dans les chemins longs.
2) Je suis toujours à la recherche d'un moyen propre et simple d'éliminer les citations 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!
modifier 12/26/2009 13:36 PST fichier de commandes entier:
Blockquote
:: dataout.bat
:: révision 12/25/2009 ajoute ~ tilde aux variables% entrantes pour éliminer les guillemets incorporés ".
:: écrit la liste d'adresses en utilisant les paramètres de ligne de commande
:: écrit la liste de sortie des données pour QBooks IIF import
:: écrit Données de la commande du marchand pour RUI
:: exemple de chaîne de ligne de commande pour les tests
:: listmail [prénom] [nom] ["chaîne d'adresse"] ["chaîne de ville"] [état] [zip] [numéro de commande] [date de péremption] [nom d'enregistrement] ["FirstName LastName"] [TransactionID] [PaymentMethod] [Total] [ProductID] [Qty] [Price_Each] [PackPrep] [Shipping] [CommissionPmt] [Invoice #]
:: exemple: dataout Bellewinkle Moose "123 Green Forest Way" "Vancouver" WA 98664 1004968 25/05/2009 "Bellewinkle Moose" "Olive Oyl" 101738 "On Account" 20,67 FK-1P 1 8,95 3,00 1,39 239
@echo off
cls
c:
cd \
cd documents and settings \ administrator \ my documents \ txt \ batchtest
traitement de l'écho% 1% 2
: VARISET
::Convertir les paramètres de 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
shift
set ($ TransactionID) =% ~ 9
shift
set ($ PaymentMethod) =% ~ 9
shift
set ($ Total) =% ~ 9
shift set ($ ProductIdentifier) =% ~ 9
shift
set ($ Quantity) =% ~ 9
shift IF / i% ($ PaymentMethod)% == MasterCard SET _Rep = BlueZap IF / i% ($ PaymentMethod)% == Visa SET _Rep = BlueZap IF / i% ($ PaymentMethod)% == PayPal SET _Rep = BlueZap IF / i% ($ PaymentMethod)% == On Account SET _Rep = RB echo% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)% >> addrlist.txt echo. >> addrlist.txt echo Fichier d'adresse écrit : ADDRFOUND écho sélectionné rep est% _Rep% echo compte sélectionné est:% _QBAcct%
ensemble de ($ Price_Each) =% ~ 9 ensemble de
décalage
($ Pack_Prep) =% ~ 9 ensemble de
décalage
($ Shipping) =% ~ 9 ensemble de
décalage
($ ServiceFee) =% ~ 9 ensemble de
décalage
($ Discount) =% ~ 9
shift
set ($ Invoice) =% ~ 9
shift
set ($ UnitPrice) =% ~ 9
set _ShipCombName =% ($ FirstName)%% ($ LastName)% le
nom de la combinaison d'écho du navire est% _ShipCombName%
pause
:: écrire des variables de chaîne dans le fichier journal
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
:: Assign Account by Fournisseur de services
IF / i% ($ PaymentMethod)% == Amazon Receivables SET _QBAcct = Amazon.com
:: 12-25-2009 a ajouté 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)% == On Account 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
:: Assign Rep designator basé sur QBAccount
IF / i% ($ PaymentMethod)% == Amazon Receivables SET _Rep = Amazon
:: 12-25-2009 a ajouté 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)% == Mail SET _Rep = RB
IF / i% ($ PaymentMethod)% == AMER SET _Rep = BlueZap
IF / i % ($ PaymentMethod)% == DISC SET _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
if errorlevel 0 goto: ADDRFOUND
: ADDRWRITE
echo% _ShipCombName% >> addrlist.txt
echo% ($ BillingAddress1)% >> addrlist.txt
pause
:: RUI OUT
:: écrire l'ID de commande du marchand et l'ID de commande RUI dans RUI
:: vérifier les données RUI en double dans writeRUI.txt : IIFWRITE :: Vérifier les données de facturation en double dans writeIIF.txt find / i "% ($ OrderNumber) % "writeIIF.txt écho niveau d'erreur:% errorlevel%
cd ..
cd RegKOut
find / i "% ($ OrderNumber)%" writeRUI.txt
echo errorlevel:% errorlevel%
si errorlevel 1 goto: RUIWRITE
if errorlevel 0 goto: IIFWRITE
: RUIWRITE
echo% ($ Invoice)% % ($ OrderNumber)% >> writeRUI.txt
:: end write RUI
:: IIF OUT
si errorlevel 1 goto: HEADWRITE
if errorlevel 0 goto: LINEWRITE
: HEADWRITE
:: write Données d'en-tête, d'expédition / de manutention, de remise, de représentant et de commission vers le fichier d'importation QB IIF
echo% ($ OrderNumber)%% ($ Purch_Date)% Invoice% ($ TransactionID)%% _QBAcct% Accounts Receivable% ($ Total)%% _Rep % >> writeIIF.txt
echo H / P% ($ Pack_Prep)% 1? >> writeIIF.txt
echo SHP% ($ Expédition)% 1? >> writeIIF.txt
echo DISC% ($ Discount)% 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 de la variable personnalisée:
echo% ($ ProductIdentifier) %% ($ Price_Each)%% ($ Quantity)%? >> writeIIF.txt
goto: EOF :: Retard de 3 secondes :: TYPE NUL | CHOICE.COM / N / CY / TY, 3> NUL : EOF
: WRITE_DEFA
: écrit les prix par défaut analysés à partir des données produit
echo% ($ ProductIdentifier)%% ($ UnitPrice)%% ($ Quantity)%? >> writeIIF.txt
goto: EOF
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).
Contribution:
Production:
Remarque: pour remplacer Double Quotes "par Single Quotes ', procédez comme suit:
Remarque: pour remplacer le mot «Monde» (non sensible à la casse) par BobB, procédez comme suit:
Production:
En ce qui concerne votre question initiale (enregistrez le code suivant dans un fichier de commandes .cmd ou .bat et exécutez):
Production:
%0
est le nom et le chemin du script.%1
est le premier argument de ligne de commande, et ainsi de suite.la source
SET BathFileAndPath=%~0
(en fait, mon tableau de paramètres commence par 1, alors j'ai utiliséSET BathFileAndPath=%~1
%widget:"=%
se débarrasse des guillemets?:old=new
est une correspondance et un remplacement de modèle dans le développement de variables. Avec"
comme leold
et rien comme lenew
, les guillemets sont supprimés, même s'ils sont au milieu, même s'ils sont déséquilibrés.Votre conclusion (1) semble erronée. 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:
Notez les citations autour
%cmd%
. Sans eux, le chemin avec des espaces ne fonctionnera pas.Si vous pouviez publier l'intégralité de votre code de lot, une réponse plus précise pourrait peut-être être apportée.
la source
%~1
asExpands %1 and removes any surrounding quotation marks ("").
cmd
sur ces modificateurs:call /?
pour l'aide sur les modificateurs de paramètres,set /?
pour les modificateurs de variables (probablement pas très intuitifs). Très pratique.En général, je supprime simplement toutes les citations de mes variables avec:
Et puis appliquez-les à nouveau partout où j'en ai besoin, par exemple:
la source
:
comme un.
- après avoir compris cela, j'ai travaillé sans accroc. Bon conseil!J'ai passé beaucoup de temps à essayer de faire cela 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:
Exemple:
Production:
la source
Cela ressemble à un simple bogue où vous utilisez% ~ quelque part où vous ne devriez pas être. L'utilisation si% ~ ne change pas fondamentalement le fonctionnement des fichiers batch, elle supprime simplement les guillemets de la chaîne dans cette seule situation.
la source
J'ai appris de ce lien , si vous utilisez XP ou une version supérieure, que cela fonctionnera simplement par lui-même:
SET params = %~1
Je ne pouvais pas faire fonctionner l'une des autres solutions ici sous Windows 7.
Pour les parcourir, j'ai fait ceci:
Remarque: Vous n'obtiendrez des guillemets doubles que si vous passez des arguments séparés par un espace généralement.
la source
Le guillemet de fin
"
de la ligne 4 ajoute un guillemet"
à la chaîne. Il devrait être supprimé. La syntaxe de la ligne 4 se termine par%
la source
widget="a very useful item"
et lisez la ligne 6 comme observez qu'elle s'affiche:widget=a very useful item"
et comprenez que la ligne 7 seraitset widget=%widget:"=%
et la ligne 8 observerait que la ligne affichéewidget=a very useful item
n'a plus de guillemet de fin .Voilà votre 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
en tant que paramètres du
programme.
Vous devez le citer pour exécuter un fichier de commandes avec des espaces dans le chemin:
aurait fonctionné.
la source
Démontre avec ou sans guillemets, indépendamment du fait que le paramètre d'origine a des guillemets ou non.
Et si vous souhaitez tester l'existence d'un paramètre qui peut être ou non entre guillemets, mettez cette ligne avant les échos ci-dessus:
Si '% 1' == '' va à votre sous
Mais si vous vérifiez l'existence d'un fichier qui peut ou non avoir des guillemets, c'est:
Si EXISTENT "! 1!" aller à d'autres
Notez que l'utilisation des guillemets simples et des guillemets doubles est différente.
la source
Toutes les réponses sont complètes. Mais je voulais ajouter une chose,
Cette ligne aurait dû fonctionner, vous aviez besoin d'un petit changement.
Incluez le devoir complet entre guillemets. Cela supprimera les citations sans problème. C'est une méthode d'affectation préférée qui résout les problèmes indésirables avec des guillemets dans les arguments.
la source
La syntaxe tilde simple fonctionne uniquement pour supprimer les guillemets autour des paramètres de ligne de commande passés dans les fichiers de commandes
Le code du fichier de commandes ci-dessus définira xyz sur la valeur qui est passée en tant que premier paramètre en supprimant les guillemets de début et de fin (si présents).
Mais, cette simple syntaxe de tilde ne fonctionnera pas pour les autres variables qui n'ont pas été transmises en tant que paramètres
Pour toutes les autres variables, vous devez utiliser une syntaxe de substitution étendue qui vous oblige à spécifier les caractères de début et de retard à supprimer. En fait, nous demandons de supprimer le premier et le dernier caractère sans regarder ce qu'il est réellement.
Si nous voulions vérifier ce que le premier et le dernier caractère étaient réellement une citation avant de le supprimer, nous aurons besoin d'un code supplémentaire comme suit
la source