Vraag Het verwijderen van dubbele aanhalingstekens uit variabelen in een batchbestand leidt tot problemen met de CMD-omgeving


Kan iemand helpen met een effectieve en veilige manier om offertes uit batchvariabelen te verwijderen?

Ik heb een batchbestand geschreven dat met succes een lijst met parameters% 1,% 2,% 3 enz. Importeert en deze in benoemde variabelen plaatst. Sommige van deze parameters bevatten meerdere woorden en zijn daarom tussen dubbele aanhalingstekens geplaatst.

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

Deze% variabelen worden vervolgens in benoemde variabelen geplaatst:

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

verificatie van variabelen gebeurt via echo.

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

resultaten worden weergegeven als

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

Ik moet de inbegrepen citaten op geselecteerde variabelen elimineren. FirstName en LastName worden bijvoorbeeld elders gebruikt en mogen geen aanhalingstekens bevatten.

In een testbatchbestand was ik succesvol in het elimineren van aanhalingstekens met behulp van het ~ tilde-teken in variabelen.

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

Ik dacht dat ik de oplossing had, maar ik kreeg al snel ongewoon gedrag met het uitvoeren van batchbestanden. Plotseling herkent CMD geen lange wegafbeeldingen. Normale uitvoering van batchbestand van volledig pad

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

komt terug

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

Het lijkt er dus op dat de toevoeging van het ~ tilde-teken aan de komende% 1% 2 ...% n variabelen enige verandering heeft veroorzaakt. Mogelijk zijn er enkele omgevingsvariabelen gewijzigd?

Ik heb ook geprobeerd om offertes van binnenuit variabele te wissen met verschillende pogingen met het FOR-commando. Dat lijkt lastig en ik heb niet kunnen leren hoe dit te bereiken door een lijst met variabelen te maken om de taak uit te voeren:

iets zoals dit:

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

Ik denk dat ik twee problemen heb.

1) Mijn 'korte en zoete' idee om ~ tilde in te voegen in de inkomende% 1% 2 variabelen (% ~ 1, enz.) Lijkt bepaalde instellingen te hebben beïnvloed en de manier veranderd waarop CMD lange padnamen navigeert.

2) Ik ben nog steeds op zoek naar een schone en gemakkelijke manier om citaten uit geselecteerde benoemde variabelen te verwijderen.

Alle hulp voor de meer ervarenen wordt het meest gewaardeerd. Ik ben aan het einde van mijn vaardigheden hier ... heb wat begeleiding nodig alstublieft!

edit 12/26/2009 13:36 PST volledig batchbestand:

blockquote
  :: dataout.bat
  :: revisie 12/25/2009 voegt ~ tilde toe aan inkomende% variabelen om ingesloten "aanhalingstekens te verwijderen.
  :: schrijft adressenlijst met behulp van parameters van de opdrachtregel
  :: schrijft data-uitvoerlijst voor import QBooks IIF
  :: schrijft gegevens over handelsorder voor RUI
  :: voorbeeldopdrachtregelreeks voor testen
  :: listmail [voornaam] [achternaam] ["adresstring"] ["stadstring"] [staat] [zip] [Bestelnummer] [Inkoopdatum] [Regname] ["Voornaam achternaam]" [TransactionID] [PaymentMethod] [ Totaal] [Product-ID] [Aantal] [Prijs_iederlijk] [PackPrep] [Verzenden] [CommissionPmt] [Factuurnummer]
  :: voorbeeld: dataout Bellewinkle Moose "123 Green Forest Way" "Vancouver" WA 98664 1004968 05/25/2009 "Bellewinkle Moose" "Olive Oyl" 101738 "Op rekening" 20.67 FK-1P 1 8.95 3.00 1.39 239
  @echo uit
  cls
  c:
  CD\
  cd-documenten en instellingen \ administrator \ mijn documenten \ txt \ batchtest
echoverwerking% 1% 2
  : VARISET
  :: Convert% n opdrachtregelparameters naar tekenreeksvariabelen
  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
  verschuiving
  set ($ TransactionID) =% ~ 9
  verschuiving
  set ($ PaymentMethod) =% ~ 9
  verschuiving
  set ($ Total) =% ~ 9
  verschuiving   set ($ ProductIdentifier) ​​=% ~ 9
  verschuiving
  set ($ Quantity) =% ~ 9
  verschuiving
  set ($ Price_Each) =% ~ 9
  verschuiving
  set ($ Pack_Prep) =% ~ 9
  verschuiving
  set ($ Shipping) =% ~ 9
  verschuiving
  set ($ ServiceFee) =% ~ 9
  verschuiving
  set ($ Korting) =% ~ 9
  verschuiving
  set ($ Invoice) =% ~ 9
  verschuiving
  set ($ UnitPrice) =% ~ 9
  set _ShipCombName =% ($ FirstName)%% ($ LastName)%
  echo schip combo naam is% _ShipCombName%
  pauze
  :: schrijf string varibables naar logfile
  echo FN% ($ Voornaam)% LN% ($ Achternaam)% BA% ($ BillingAddress1)%% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)%% ($ OrderNumber)%% ($ Purch_Date )%% ($ RegistrationName)%% ($ TransactionID)%% ($ PaymentMethod)%% ($ Total)%% ($ ProductIdentifier)%% ($ Quantity)%% ($ Price_Each)%% ($ Pack_Prep)% % ($ Verzendkosten)%% ($ ServiceFee)%% ($ korting)%% ($ factuur)%% ($ UnitPrice)%% _ShipCombName% >> d_out_log.txt
  :: Account toewijzen door serviceprovider
  IF / i% ($ PaymentMethod)% == Amazon Receivables SET _QBAcct = Amazon.com
  :: 12-25-2009 tweede Amazon pm't-methode toegevoegd voor veelzijdigheid
  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)% == Op 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
  :: Rep-aanduiding toewijzen op basis van QBAccount
  IF / i% ($ PaymentMethod)% == Amazon Receivables SET _Rep = Amazon
  :: 12-25-2009 tweede Amazon pm't-methode toegevoegd voor veelzijdigheid
  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)% == Op account 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
  :: controleer voor dubbele adresgegevens
  findstr / i / s "% _ShipCombName%" addrlist.txt
echo errorlevel:% errorlevel%
  if errorlevel 1 goto: ADDRWRITE
  if errorlevel 0 goto: ADDRFOUND
  : ADDRWRITE
  echo% _ShipCombName% >> addrlist.txt
  echo% ($ BillingAddress1)% >> addrlist.txt
  echo% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)% >> addrlist.txt
  echo. >> addrlist.txt
  echo Adresbestand geschreven
  : ADDRFOUND
  echo geselecteerde rep is% _Rep%
  echo geselecteerde account is:% _QBAcct%
  pauze
  :: RUI OUT
  :: schrijf Merchant Order ID & RUI Order ID aan RUI
  :: controleer op dubbele RUI-gegevens in writeRUI.txt
  CD..
  cd RegKOut
  find / i "% ($ OrderNumber)%" writeRUI.txt
echo errorlevel:% errorlevel%
  if errorlevel 1 goto: RUIWRITE
  if errorlevel 0 goto: IIFWRITE
  : RUIWRITE
  echo% ($ Invoice)%% ($ OrderNumber)% >> writeRUI.txt
  :: einde schrijf RUI
  :: IIF UIT
  : IIFWRITE
  :: Controleer op dubbele factuurgegevens in writeIIF.txt
  vind / i "% ($ OrderNumber)%" writeIIF.txt
echo errorlevel:% errorlevel%
  if errorlevel 1 goto: HEADWRITE
  if errorlevel 0 goto: LINEWRITE
  : HEADWRITE
  :: schrijf Header, Ship / Handling, korting, Rep & commissie gegevens naar QB IIF importbestand
  echo% ($ OrderNumber)%% ($ Purch_Date)% Factuur% ($ TransactionID)%% _QBAcct% Debiteuren% ($ Totaal)%% _Rep% >> writeIIF.txt
  echo H / P% ($ Pack_Prep)% 1? >> writeIIF.txt
  echo SHP% ($ verzending)% 1? >> writeIIF.txt
  echo DISC% ($ korting)% 1? >> writeIIF.txt
  echo Comm% ($ ServiceFee)% 1? >> writeIIF.txt
  : LINEWRITE
  IF / i% ($ ProductIdentifier)% equ PH-1 ga naar WRITE_DEFA ELSE ga naar WRITE_DISC
  echo% ($ ProductIdentifier)%
  : WRITE_DISC
  :: schrijft gereduceerde prijzen die zijn geparseerd uit de aangepaste variabele:
  echo% ($ ProductIdentifier)%% ($ Price_Each)%% ($ Quantity)%? >> writeIIF.txt
  ga naar: EOF
  : WRITE_DEFA
  : schrijft standaardprijzen die zijn geparseerd uit Productgegevens
  echo% ($ ProductIdentifier)%% ($ UnitPrice)%% ($ Quantity)%? >> writeIIF.txt
  ga naar: EOF
  :: 3 seconden vertraging
  :: TYPE NUL | CHOICE.COM / N / CY / TY, 3> NUL
  : EOF


93
2017-12-26 19:48


oorsprong


antwoorden:


Je hebt aan het einde een extra dubbel aanhalingsteken, dat is het terug toevoegen aan het einde van de string (na het verwijderen van beide aanhalingstekens uit de string).

Invoer:

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

Output:

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

Opmerking: om dubbele aanhalingstekens te vervangen door enkele aanhalingstekens doet u het volgende:

set widget=%widget:"='%

Opmerking: om het woord "Wereld" (niet hoofdlettergevoelig) te vervangen door BobB, doet u het volgende:

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

Output:

widget="Hello BobB!"

Wat je eerste vraag betreft (sla de volgende code op in een batchbestand .cmd of .bat en run):

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

Output:

"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 is de Scriptnaam en het Pad.
%1 is het eerste argument van de opdrachtregel, enzovoort.


162
2018-03-03 13:15



Uw conclusie (1) klinkt verkeerd. Er moet een andere factor in het spel zijn.

Het probleem van aanhalingstekens in batchbestandsparameters wordt normaal gesproken opgelost door de aanhalingstekens te verwijderen met %~ en vervolgens handmatig terugplaatsen waar nodig.

bijv .:

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

"%cmd%" %params%

Noteer de aanhalingstekens in de buurt %cmd%. Zonder hen werkt pad met spaties niet.

Als u uw volledige batchcode zou kunnen posten, zou er misschien een specifieker antwoord kunnen worden gegeven.


29
2017-12-26 20:10



Besteed veel tijd aan het proberen om dit op een eenvoudige manier te doen. Nadat ik zorgvuldig naar FOR loop keek, besefte ik dat ik dit met slechts één regel code kan doen:

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

Voorbeeld:

@ECHO OFF
SET Quoted="Test string"

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

ECHO %Quoted%
ECHO %Unquoted%

Output:

"Test string"
Test string

8
2018-01-10 11:26



Ik verwijder meestal alle citaten uit mijn variabelen met:

set var=%var:"=%

En pas ze dan opnieuw toe waar ik ze nodig heb, bijvoorbeeld:

echo "%var%"

8
2017-12-02 13:15



Dit klinkt als een simpele bug waarbij je% ~ ergens gebruikt waar je niet zou moeten zijn. Het gebruik als% ~ de manier waarop batchbestanden werken niet fundamenteel verandert, verwijdert alleen maar citaten uit de string in die ene situatie.


3
2017-12-26 20:12



Ik heb hiervan geleerd link, als u XP of hoger gebruikt, zal dit vanzelf werken:

SET params = %~1

Ik kon geen van de andere oplossingen hier krijgen om met Windows 7 te werken.

Om dit te herhalen, deed ik dit:

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

Opmerking: u krijgt alleen dubbele aanhalingstekens als u argumenten doorgeeft die worden gescheiden door een spatie.


2
2018-04-01 17:27



  1. set widget = "een zeer nuttig item"
  2. widget instellen
  3. widget = "een zeer nuttig item"
  4. set widget =% widget: "=%"
  5. widget instellen
  6. set widget = een zeer bruikbaar item "

Het volgende citaat " in regel 4 is een citaat toegevoegd " naar de string. Het moet worden verwijderd. De syntaxis voor regel 4 eindigt met %


0
2017-11-18 01:32



Ik dacht dat ik de oplossing had, maar ik kreeg al snel ongewoon gedrag met het uitvoeren van batchbestanden. Plotseling herkent CMD geen lange wegafbeeldingen. Normale uitvoering van batchbestand van volledig pad

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

komt terug

'C: \ Documents' wordt niet herkend als een interne of externe opdracht ....

Daar is je hele probleem. CMD begrijpt spaties in bestandsnamen niet vanaf de opdrachtregel, dus het denkt dat je probeert door te geven

en Instellingen \ Administrator \ Mijn documenten \ Txt \ batchtest \ dataout.bat

als parameters voor de

"C: \ Documents"

programma.

U moet dit citeren om een ​​batchbestand met spaties in het pad uit te voeren:

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

zou gewerkt hebben.


0
2017-12-12 21:05



@echo off

Setlocal enabledelayedexpansion

Set 1=%1

Set 1=!1:"=!

Echo !1!

Echo "!1!"

Set 1=

Demonstreert met of zonder aanhalingstekens reguardless of de oorspronkelijke parameter al dan niet aanhalingstekens bevat.

En als je het bestaan ​​van een parameter, die al dan niet tussen aanhalingstekens staat, wilt testen, plaats je deze regel vóór de echo's hierboven:

Als '% 1' == '' ga naar de pagina

Maar als er wordt gecontroleerd op het bestaan ​​van een bestand dat al dan niet citaten bevat, dan is het:

Als EXIST "! 1!" ga naar otherub

Let op het gebruik van enkele aanhalingstekens en dubbele aanhalingstekens zijn verschillend.


0
2018-03-24 22:03



Alle antwoorden zijn voltooid. Maar wilde een ding toevoegen,

stel FirstName =% ~ 1 in

stel LastName =% ~ 2 in

Deze regel had moeten werken, je had een kleine verandering nodig.

stel "FirstName =% ~ 1" in

stel "LastName =% ~ 2" in

Vermeld de volledige toewijzing tussen aanhalingstekens. Het verwijdert citaten zonder een probleem. Dit is een voorkeurstoewijzing die ongewenste problemen met aanhalingstekens in argumenten oplost.


0
2017-09-18 19:13