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.
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.
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
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.
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With