从变量在批处理文件中删除双引号创建了CMD的环境问题 [英] Removing double quotes from variables in batch file creates problems with CMD environment

查看:187
本文介绍了从变量在批处理文件中删除双引号创建了CMD的环境问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

任何人都可以从一批变量去掉引号,安全,有效的方式帮助?

我已经写了这成功导入参数%1%2%3等列表,并将其放入命名变量的批处理文件。其中一些参数包含多个单词,并为此被双引号括起来。

 > 苏西乔(%1)
> 史密斯巴恩斯(%2)
> 123 E.主街 (3%)

这些变量%旁边放置在命名变量:

 >集名字=%1
>设置姓氏= 2%
>设置ShipAddr = 3%

变量验证是通过回声完成。


  

回声%名字%结果
  回声%名字%结果
  回声%ShipAddr%


结果显示为

 苏茜乔
史密斯巴恩斯
123 E.主街

我需要消除选定变量包含引号。例如,名字和姓氏的其他地方使用,不得包括引号。

在一个测试批处理文件,我成功地使用〜波浪号字符变量消除引号。

 >集名字=%〜1
>设置姓氏=%〜2

我觉得我有解决方案,但我很快就经历了批处理文件执行的异常行为。突然CMD是没有认识到长路径statments。从完整路径的批处理文件的正常执行

 > C:\\ Documents和Settings \\管理员\\我的文档\\ TXT \\ batchtest \\ dataout.bat

返回

 > C:\\文件未被识别为一个内部或外部命令....

所以它会出现在另外〜波浪号字符到在未来的%1%2 ...%n个变量引起了一些变化。可能还有一些环境变量已经改变?

我也尝试从变量中使用FOR命令各种尝试结算报价。这似乎是尴尬,我一直无法学会如何做到这一点通过创建变量列表来执行任务:

是这样的:

 在%%克(%名字%%名字%)做(
设置%% G = %%〜摹
集%% H = %%〜^ h
集名字= %%〜摹
设置姓氏= %% ^ h
回声%名字%%名字%

我觉得我有两个问题。

插入的

1)我的简短而亲切的想法〜波浪号传入%1%2变量(%〜1等)似乎也影响了一些设置和修改CMD如何导航长路径名。

2)我仍然在寻找一个清洁,简单的方法来消除选定的命名变量的报价。

对于那些更有经验的将是最AP preciated任何帮助。我在这里我的技能到底......需要一些指导,请!

编辑2009/12/26 13:36 PST
整批处理文件:


  

块引用结果
  :: dataout.bat结果
  ::修订2009年12月25日补充〜波浪传入%的变量,消除嵌入引号。结果
  ::使用命令行参数写入地址列表结果
  ::对QBooks IIF进口结果写入数据输出列表
  ::对RUI结果写入商家订单数据
  ::示例命令行字符串用于测试结果
  :: listmail [名字] [姓氏] [地址字符串] [城市字符串] [状​​态] [拉链] [订单号] [PurchDate] [寄存器名] [姓] [的TransactionID] [PAYMENTMETHOD] [总计]的[ProductID] [数量] [Price_Each] [包$ p $页] [送货] [CommissionPmt] [发票#]结果
  ::例如:DATAOUT Bellewinkle驼鹿123绿色森林之路,温哥华WA 98664 1004968 2009年5月25日Bellewinkle麋,橄榄奥维尔101738帐户20.67 FK-1P 1 8.95 3.00 1.39 239结果
  @回响结果
  CLS结果
  C:结果
  CD \\结果
  CD的Documents and Settings \\管理员\\我的文档\\ TXT \\ batchtest结果
  回波处理%1%2结果
  :VARISET结果
  ::转换%N命令行参数字符串变量结果
  集($名字)=%〜1结果
  集($姓氏)=%〜2结果
  集($ BillingAddress1)=%〜3结果
  集($结算城市)=%〜4结果
  集($ BillingState)=%〜5结果
  集($ BillingPostal)=%〜6结果
  集($ ORDERNUMBER)=%〜7结果
  集($ Purch_Date)=%〜8结果
  集($ RegistrationName)=%〜9结果
  移动搜索
  集($的TransactionID)=%〜9结果
  移动搜索
  集($ PAYMENTMETHOD)=%〜9结果
  移动搜索
  集($总计)=%〜9结果
  转移
  集($产品识别)=%〜9结果
  移动搜索
  集($数量)=%〜9结果
  移动搜索
  集($ Price_Each)=%〜9结果
  移动搜索
  集($ Pack_ preP)=%〜9结果
  移动搜索
  集($航运)=%〜9结果
  移动搜索
  集($ ServiceFee)=%〜9结果
  移动搜索
  集($折扣)=%〜9结果
  移动搜索
  集($发票)=%〜9结果
  移动搜索
  集($单价)=%〜9结果
  设置_ShipCombName =%($名字)%%($姓氏)%结果
  回声船组合名称是%_ShipCombName%结果
  暂停结果
  ::写入字符串varibables到logfile结果
  回声FN%($名字)%LN%($姓氏)%BA%($ BillingAddress1)%%($结算城市)%%($ BillingState)%%($ BillingPostal)%%($ ORDERNUMBER)%%($ Purch_Date )%%($ RegistrationName)%%($的TransactionID)%%($ PAYMENTMETHOD)%%($总计)%%($产品识别)%%($数量)%%($ Price_Each)%%($ Pack_ preP)%%($航运)%%($ ServiceFee)%%($折扣)%%($发票)%%($单价)%% _ShipCombName%>> d_out_log.txt结果
  ::由服务供应商指定的帐户结果
  IF / I%($ PAYMENTMETHOD)==%应收账款亚马逊SET _QBAcct = Amazon.com结果
  :: 2009年12月25日第二次加亚马逊pm't方法的通用性结果
  IF / I%($ PAYMENTMETHOD)==%亚马逊SET _QBAcct = Amazon.com结果
  IF / I%($ PAYMENTMETHOD)==%MAST SET _QBAcct =认证/净结果
  IF / I%($ PAYMENTMETHOD)==%万事达SET _QBAcct =认证/净结果
  IF / I%($ PAYMENTMETHOD)==%SET签证= _QBAcct验证/净结果
  IF / I%($ PAYMENTMETHOD)==%的PayPal SET _QBAcct = PayPalPmts结果
  IF / I%($ PAYMENTMETHOD)==%记帐SET _QBAcct =%($ RegistrationName)%结果
  IF / I%($ PAYMENTMETHOD)==%SET邮件= _QBAcct%($ RegistrationName)%结果
  IF / I%($ PAYMENTMETHOD)==%AMER SET _QBAcct =认证/净结果
  IF / I%($ PAYMENTMETHOD)==%DISC SET _QBAcct =认证/净结果
  ::基于QBAccount结果分配众议员标志
  IF / I%($ PAYMENTMETHOD)==%应收账款亚马逊SET _Rep =亚马逊结果
  :: 2009年12月25日第二次加亚马逊pm't方法的通用性结果
  IF / I%($ PAYMENTMETHOD)==%亚马逊SET _Rep =亚马逊结果
  IF / I%($ PAYMENTMETHOD)==%MAST SET _Rep = BlueZap结果
  IF / I%($ PAYMENTMETHOD)==%万事达SET _Rep = BlueZap结果
  IF / I%($ PAYMENTMETHOD)==%SET签证= _Rep结果BlueZap
  IF / I%($ PAYMENTMETHOD)==%的PayPal SET _Rep = BlueZap结果
  IF / I%($ PAYMENTMETHOD)==%记帐SET _Rep = R B结果
  IF / I%($ PAYMENTMETHOD)==%SET邮件= _Rep R B结果
  IF / I%($ PAYMENTMETHOD)==%AMER SET _Rep = BlueZap结果
  IF / I%($ PAYMENTMETHOD)==%DISC SET _Rep = BlueZap结果
  ::检查重复的地址数据结果
  FINDSTR / I / S%_ShipCombName%addrlist.txt结果
  回声错误级别:%ERRORLEVEL%结果
  如果ERRORLEVEL 1页转到:ADDRWRITE结果
  如果错误级别0转到:ADDRFOUND结果
  :ADDRWRITE结果
  回声%_ShipCombName%>> addrlist.txt结果
  回声%($ BillingAddress1)%>> addrlist.txt结果
  回声%($结算城市)%%($ BillingState)%%($ BillingPostal)%>> addrlist.txt结果
  回声。 >> addrlist.txt结果
  回声地址写入文件的结果
  :ADDRFOUND结果
  呼应选择代表为%_Rep%结果
  回声选择的帐户是:%_QBAcct%结果
  暂停结果
  :: RUI OUT结果
  ::写入商家订单ID和放大器; RUI订单ID瑞结果
  ::为您在writeRUI.txt结果的重复数据RUI
  CD ..结果
  CD RegKOut结果
  查找/ I%($ ORDERNUMBER)%writeRUI.txt结果
  回声错误级别:%ERRORLEVEL%结果
  如果ERRORLEVEL 1页转到:RUIWRITE结果
  如果错误级别0转到:IIFWRITE结果
  :RUIWRITE结果
  回声%($发票)%%($ ORDERNUMBER)%>> writeRUI.txt结果
  ::结束写入RUI结果
  :: IIF OUT结果
  :IIFWRITE结果
  ::为您在writeIIF.txt结果重复发票数据
  查找/ I%($ ORDERNUMBER)%writeIIF.txt结果
  回声错误级别:%ERRORLEVEL%结果
  如果ERRORLEVEL 1页转到:HEADWRITE结果
  如果错误级别0转到:LINEWRITE结果
  :HEADWRITE结果
  ::写报头,船舶/处理,折扣,众议员和放大器;佣金数据QB IIF导入文件结果
  回声%($ ORDERNUMBER)%%($ Purch_Date)%发票%($的TransactionID)%% _QBAcct%应收账款%($总计)%%_Rep%>> writeIIF.txt结果
  回声H / P%($ Pack_ preP)%1? >> writeIIF.txt结果
  回声SHP%($航运)%1? >> writeIIF.txt结果
  回声DISC%($折扣)%1? >> writeIIF.txt结果
  回声通讯%($ ServiceFee)%1? >> writeIIF.txt结果
  :LINEWRITE结果
  IF / I%($产品识别)%EQU PH-1页转到WRITE_DEFA ELSE转到WRITE_DISC结果
  回声%($产品识别)%结果
  :WRITE_DISC结果
  ::写道折扣价格从自定义变量分析:结果
  回声%($产品识别)%%($ Price_Each)%%($数量)%? >> writeIIF.txt结果
  GOTO:EOF结果
  :WRITE_DEFA结果
  :写默认价格从产品数据结果分析
  回声%($产品识别)%%($单价)%%($数量)%? >> writeIIF.txt结果
  GOTO:EOF结果
  :: 3秒延迟结果
  :: TYPE NUL | CHOICE.COM / N / CY / TY,3> NUL结果
  :EOF



解决方案

您已经到了最后,这是将它添加回字符串的结尾(去除串两个引号后),一个额外的双引号。

输入:

 设置小部件=一个非常有用的项目
小工具集
设置窗口小部件=%部件:=%
小工具集

输出:

 部件=一个非常有用的项目
插件=一个非常有用的项

注:要更换双引号单引号'做到以下几点:

 设置小部件=%部件:=%

请注意:要(不区分大小写)与BOBB取代世界做到以下几点:

 设置小部件=的Hello World!
集部件=%部件:世界= BOBB%
小工具集

输出:

 部件=你好BOBB!

至于您最初的问题去(保存下列code到一个批处理文件的.cmd或.bat和运行):

  @ECHO OFF
ECHO%0
SET Ba​​thFileAndPath =%〜0
ECHO%BathFileAndPath%
ECHO%BathFileAndPath%
ECHO%〜0
ECHO%0
暂停

输出:

 C:\\用户\\测试\\文档\\批处理文件\\删除Quotes.cmd
C:\\用户\\测试\\文档\\批处理文件\\删除Quotes.cmd
C:\\用户\\测试\\文档\\批处理文件\\删除Quotes.cmd
C:\\用户\\测试\\文档\\批处理文件\\删除Quotes.cmd
C:\\用户\\测试\\文档\\批处理文件\\删除Quotes.cmd
preSS任意键继续。 。 。

0%是脚本名称和路径。结果
%1 是第一个命令行参数,依此类推。

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:

Blockquote
:: 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

解决方案

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.

这篇关于从变量在批处理文件中删除双引号创建了CMD的环境问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆