Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Removing double quotes from variables in batch file creates problems with CMD environment

Can anybody help with effective and safe way of removing quotes from batch variables?

I have written a batch file which successfully imports a list of parameters %1, %2, %3 etc. and places them into named variables. Some of these parameters contain multiple words, and therefor are enclosed in double quotes.

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

These %variables are next placed in named variables:

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

verification of variables is done by echo. > echo.%FirstName%
> echo.%LastName%
> echo.%ShipAddr%

results display as

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

I need to eliminate the included quotes on selected variables. For instance, FirstName and LastName are used elsewhere and must not include quotes.

In a test batch file I was successful at eliminating quotes using the ~tilde character in variables.

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

I thought I had the solution, but I soon experienced unusual behavior with execution of batch files. Suddenly CMD is no recognizing long path statments. Normal execution of batch file from full path

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

returns

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

So it would appear that the addition of the ~tilde character to the in-coming %1 %2...%n variables has caused some change. Possibly some environment variables have been altered?

I also tried clearing quotes from within variable with various attempts using the FOR command. That seems awkward and I have been unable to learn how to accomplish this by creating a list of variable to perform the task:

something like this:

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

I think I have two issues.

  1. My 'short and sweet' idea of inserting ~tilde in the incoming %1 %2 variables (%~1, etc) seems to have affected some settings and altered how CMD navigates long pathnames.

  2. I'm still in search of a clean and easy way to eliminate quotes from selected named variables.

Any help for those more experienced would be most appreciated. I'm at the end of my skills here... need some guidance please!

edit 12/26/2009 13:36 PST entire batch file:

:: dataout.bat   :: revision 12/25/2009 add ~tilde to incoming %variables to eliminate embedded "quotation marks.   :: writes address list using command line parameters   :: writes data output list for QBooks IIF import   :: writes Merchant Order data for RUI   :: sample command line string for testing   :: listmail[firstname][lastname]["address string"]["city string"][state][zip][Order#][PurchDate][Regname]["FirstName LastName"][TransactionID][PaymentMethod][Total][ProductID][Qty][Price_Each][PackPrep] [Shipping] [CommissionPmt] [Invoice#]   :: example: dataout Bellewinkle Moose "123 Green Forest Way" "Vancouver" WA 98664 1004968 05/25/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   echo processing %1 %2   :VARISET   :: Convert %n command line parameters to string variables   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   set ($Price_Each)=%~9   shift   set ($Pack_Prep)=%~9   shift   set ($Shipping)=%~9   shift   set ($ServiceFee)=%~9   shift   set ($Discount)=%~9   shift   set ($Invoice)=%~9   shift   set ($UnitPrice)=%~9   set _ShipCombName=%($FirstName)% %($LastName)%   echo ship combo name is %_ShipCombName%   pause   :: write string varibables to 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   :: Assign Account by Service Provider   IF /i %($PaymentMethod)%==Amazon Receivables SET _QBAcct=Amazon.com   :: 12-25-2009 added second Amazon pm't method for versatility   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 based on QBAccount   IF /i %($PaymentMethod)%==Amazon Receivables SET _Rep=Amazon   :: 12-25-2009 added second Amazon pm't method for versatility   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)%==On 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   :: check for duplicate address data   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 Address File Written   :ADDRFOUND   echo selected rep is %_Rep%   echo selected account is: %_QBAcct%   pause   :: RUI OUT   :: write Merchant Order ID & RUI Order ID to RUI   :: check for duplicate RUI data 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   :: end write RUI   :: IIF OUT   :IIFWRITE   :: Check for duplicate invoice data in writeIIF.txt   find /i "%($OrderNumber)%" writeIIF.txt   echo errorlevel: %errorlevel%   if errorlevel 1 goto :HEADWRITE   if errorlevel 0 goto :LINEWRITE   :HEADWRITE   :: write Header, Ship/Handling, discount, Rep & commission data to QB IIF import file   echo %($OrderNumber)%   %($Purch_Date)% Invoice %($TransactionID)%  %_QBAcct%   Accounts Receivable             %($Total)%  %_Rep% >> writeIIF.txt     echo                        H/P %($Pack_Prep)%  1   ? >> writeIIF.txt   echo                        SHP %($Shipping)%   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   ::writes discounted prices parsed from custom variable:   echo                        %($ProductIdentifier)%  %($Price_Each)% %($Quantity)%   ? >> writeIIF.txt   goto :EOF   :WRITE_DEFA   :writes default prices parsed from Product data   echo                        %($ProductIdentifier)%  %($UnitPrice)%  %($Quantity)%   ? >> writeIIF.txt   goto :EOF   :: 3-second delay   :: TYPE NUL | CHOICE.COM /N /CY /TY,3 >NUL   :EOF    
like image 763
BobB Avatar asked Dec 26 '09 19:12

BobB


People also ask

How do I escape double quotes in CMD?

Escape every double quote " with a caret ^ . If you want other characters with special meaning to the Windows command shell (e.g., < , > , | , & ) to be interpreted as regular characters instead, then escape them with a caret, too.

Why is %% used in batch file?

Use double percent signs ( %% ) to carry out the for command within a batch file. Variables are case sensitive, and they must be represented with an alphabetical value such as %a, %b, or %c. Required. Specifies one or more files, directories, or text strings, or a range of values on which to run the command.

How do you remove a quote from a string variable?

To remove double quotes just from the beginning and end of the String, we can use a more specific regular expression: String result = input. replaceAll("^\"|\"$", ""); After executing this example, occurrences of double quotes at the beginning or at end of the String will be replaced by empty strings.

How do you use quotation marks in CMD?

Generally, to differentiate commands from other types of instructions, enclose the command within single or double quotation marks. When issuing TSO/E commands in an exec, it is recommended that you enclose them in double quotation marks.


1 Answers

You have an extra double quote at the end, which is adding it back to the end of the string (after removing both quotes from the string).

Input:

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

Output:

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

Note: To replace Double Quotes " with Single Quotes ' do the following:

set widget=%widget:"='% 

Note: To replace the word "World" (not case sensitive) with BobB do the following:

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

Output:

widget="Hello BobB!" 

As far as your initial question goes (save the following code to a batch file .cmd or .bat and 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 the Script Name and Path.
%1 is the first command line argument, and so on.

like image 76
Mr. Rick Avatar answered Sep 28 '22 15:09

Mr. Rick