从batch file中的variables中删除双引号引起CMD环境的问题

任何人都可以帮助有效和安全地从批处理variables中删除引号吗?

我写了一个成功导入参数%1,%2,%3等列表的batch file,并将它们放入命名variables中。 其中一些参数包含多个单词,因此用双引号引起来。

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

这些%variables接下来放在命名variables中:

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

variables的validation由echo完成。

回声。%姓%
回声。%名字%
回声。%ShipAddr%

结果显示为

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

我需要消除所选variables中包含的引号。 例如,FirstName和LastName在其他地方使用,不得包含引号。

在一个testingbatch file中,我成功地用variables中的〜代字符去掉了引号。

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

我以为我有解决scheme,但我很快就遇到了执行batch file的exception行为。 突然CMD不认识长path的说法。 从完整path正常执行batch file

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

回报

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

所以看起来〜@ tilde字符添加到即将到来的%1%2 …%nvariables中引起了一些变化。 可能有些环境variables已经改变了?

我也尝试使用FOR命令从各种尝试中清除引号。 这似乎很尴尬,我一直无法学习如何通过创build一个variables列表来完成这个任务:

像这样的东西:

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

我想我有两个问题。

1)在传入的%1%2variables(%〜1等)中插入〜代字符的'短而甜'的想法似乎影响了一些设置,并改变了CMD如何导航长path名。

2)我仍然在寻找一个干净而简单的方法来消除选定命名variables的引号。

对于那些更有经验的人来说,任何帮助都是最值得赞赏 我在这里的技能结束…需要一些指导,请!

编辑12/26/2009 13:36 PST整个batch file:

大段引用
:: dataout.bat
:: revision 12/25/2009将inputvariables添加到variables中以消除embedded的“引号”。
::使用命令行参数写入地址列表
::为QBooks IIF导入写入数据输出列表
::为RUI写入商户订单数据
::示例命令行string进行testing
:: listmail [firstname] [lastname] [“address string”] [“city string”] [state] [zip] [Order#] [PurchDate] [Regname] [“FirstName LastName”] [TransactionID] [PaymentMethod] [总计] [ProductID] [数量] [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
@echoclosures
CLS
C:
光盘\
cd文件和设置\pipe理员\我的文档\ txt \ batchtest
回声处理%1%2
:VARISET
::将%n个命令行参数转换为stringvariables
设置($ FirstName)=%〜1
设置($姓氏)=%〜2
设置($ BillingAddress1)=%〜3
设置($ BillingCity)=%〜4
设置($ BillingState)=%〜5
设置($ BillingPostal)=%〜6
设置($ OrderNumber)=%〜7
设置($ Purch_Date)=%〜8
设置($注册名称)=%〜9
转移
设置($ TransactionID)=%〜9
转移
设置($ PaymentMethod)=%〜9
转移
设置($总计)=%〜9
class组($ ProductIdentifier)=%〜9
转移
设置($数量)=%〜9
转移
设置($ Price_Each)=%〜9
转移
设置($ Pack_Prep)=%〜9
转移
设置($ Shipping)=%〜9
转移
设置($ ServiceFee)=%〜9
转移
设置($ Discount)=%〜9
转移
设置($发票)=%〜9
转移
设置($ UnitPrice)=%〜9
设置_ShipCombName =%($名字)%%($姓氏)%
回波舰组合名称是%_ShipCombName%
暂停
::将stringvaribables写入日志文件
($ BillingState)%%($ BillingPostal)%%($ OrderNumber)%%($ Purch_Date)回复FN%($ FirstName)%LN%($ LastName)%BA%($ BillingAddress1)%%($ BillingCity) )%%($ RegistrationName)%%($ TransactionID)%%($ PaymentMethod)%%($ Total)%%($ ProductIdentifier)%%($ Quantity)%%($ Pack_Prep)% %($ Shipping)%%($ ServiceFee)%%($ Discount)%%($ Invoice)%%($ UnitPrice)%%_ShipCombName%>> d_out_log.txt
::服务提供商分配账户
IF / i%($ PaymentMethod)%== Amazon应收账款设置_QBAcct = Amazon.com
:: 12-25-2009增加了第二个亚马逊pm't方法的多function性
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)%==在帐户上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
::基于QBAccount分配Rep指示符
IF / i%($ PaymentMethod)%== Amazon应收账款设置_Rep =亚马逊
:: 12-25-2009增加了第二个亚马逊pm't方法的多function性
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)%==在帐户上SET _Rep = RB
IF / i%($ PaymentMethod)%== Mail SET _Rep = RB
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
echo%_ShipCombName%>> addrlist.txt
echo%($ BillingAddress1)%>> addrlist.txt
echo%($ BillingCity)%%($ BillingState)%%($ BillingPostal)%>> addrlist.txt
回声。 >> addrlist.txt
回声地址文件写入
:ADDRFOUND
回声select代表是%_Rep%
echo选中的帐号是:%_QBAcct%
暂停
:: RUI OUT
::将商家订单ID和RUI订单ID写入RUI
::在writeRUI.txt中检查重复的RUI数据
光盘..
cd RegKOut
find / i“%($ OrderNumber)%”writeRUI.txt
回声errorlevel:%errorlevel%
如果错误级别1转到:RUIWRITE
如果errorlevel 0 goto:IIFWRITE
:RUIWRITE
echo%($ Invoice)%%($ OrderNumber)%>> writeRUI.txt
::结束写RUI
:: IIF OUT
:IIFWRITE
::在writeIIF.txt中检查重复的发票数据
find / i“%($ OrderNumber)%”writeIIF.txt
回声errorlevel:%errorlevel%
如果errorlevel 1 goto:HEADWRITE
如果errorlevel 0 goto:LINEWRITE
:HEADWRITE
::写标题,出货/处理,折扣,报告和佣金数据到QB IIF导入文件
echo%($ OrderNumber)%%($ Purch_Date)%发票%($ TransactionID)%% _QBAcct%应收账款%($总计)%%_Rep%>> writeIIF.txt
回声H / P%($ Pack_Prep)%1? >> writeIIF.txt
echo SHP%($ Shipping)%1? >> writeIIF.txt
回音DISC%($ Discount)%1? >> writeIIF.txt
echo Comm%($ ServiceFee)%1? >> writeIIF.txt
:LINEWRITE
IF / i%($ ProductIdentifier)%equ PH-1转到WRITE_DEFA ELSE转到WRITE_DISC
回声%($ ProductIdentifier)%
:WRITE_DISC
::写自定义variablesparsing的折扣价格:
回声%($ ProductIdentifier)%%($ Price_Each)%%($数量)%? >> writeIIF.txt
转到:EOF
:WRITE_DEFA
:编写从产品数据parsing的默认价格
echo%($ ProductIdentifier)%%($ UnitPrice)%%($ Quantity)%? >> writeIIF.txt
转到:EOF
:: 3秒延迟
::typesNUL | CHOICE.COM / N / CY / TY,3> NUL
:EOF

您最后还有一个额外的双引号,即将其添加回到string的末尾(将两个引号从string中移除后)。

input:

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

输出:

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

注:要将双引号replace为“单引号”,请执行以下操作:

 set widget=%widget:"='% 

注意:用BobBreplace单词“World”(不区分大小写),请执行以下操作:

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

输出:

 widget="Hello BobB!" 

至于您最初的问题(将以下代码保存到batch file.cmd或.bat并运行):

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

输出:

 "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是脚本名称和path。
%1是第一个命令行参数,依此类推。

你的结论(1)听起来不对。 还有一些其他的因素在起作用。

batch file参数中的引号问题通常是通过删除带有%~的引号,然后在适当的地方手动将其放回来来解决的。

例如:

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

请注意%cmd%附近的引号。 没有他们,path与空间将无法正常工作。

如果你可以发布你的整个批处理代码,也许更具体的答案可以作出。

花了很多时间试图以一种简单的方式做到这一点。 仔细查看FOR循环后,我意识到我可以用一行代码来完成这个工作:

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

例:

 @ECHO OFF SET Quoted="Test string" FOR /F "delims=" %%I IN (%Quoted%) DO SET Unquoted=%%I ECHO %Quoted% ECHO %Unquoted% 

输出:

 "Test string" Test string 

我通常只是从我的variables中删除所有的引号:

 set var=%var:"=% 

然后,无论我需要他们再次应用他们,例如:

 echo "%var%" 

这听起来像一个简单的错误,你正在使用%〜某处你不应该的地方。 使用如果%〜不能从根本上改变batch file的工作方式,它只是在单一情况下从string中删除引号。

我从这个链接了解到,如果你使用的是XP或更高版本,那么这个工作本身就很简单:

SET params = %~1

我无法在Windows 7上使用其他解决scheme。

为了遍历它们,我这样做了:

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

注意:如果您传递的参数通常以空格分隔,则只会得到双引号。

  1. 设置小部件=“一个非常有用的项目”
  2. 设置小部件
  3. widget =“一个非常有用的项目”
  4. 设置小部件=%小部件:“=%”
  5. 设置小部件
  6. 设置小部件=一个非常有用的项目“

尾随的报价"在第4行添加一个报价"的string。 它应该被删除。 第4行的语法以%

我以为我有解决scheme,但我很快就遇到了执行batch file的exception行为。 突然CMD不认识长path的说法。 从完整path正常执行batch file

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

回报

'C:\ Documents'不被识别为内部或外部命令….

这是你的全部问题。 CMD不了解命令行文件名中的空格,所以它认为你正在尝试通过

和Settings \ Administrator \ My Documents \ Txt \ batchtest \ dataout.bat

作为参数

“C:\文档”

程序。

您需要引用它以在path中运行带有空格的batch file:

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

会工作。

 @echo off Setlocal enabledelayedexpansion Set 1=%1 Set 1=!1:"=! Echo !1! Echo "!1!" Set 1= 

无论原始参数是否带有引号,都会显示带引号或不带引号。

如果你想testing一个可能引用或不引用的参数的存在,把这一行放在上面的回声之前:

如果'%1'==''转到yoursub

但是,如果检查可能或不可能引用的文件的存在,那么它是:

如果EXIST“!1!” goto othersub

注意使用单引号和双引号是不同的。

所有的答案都是完整的。 但是想补充一件事情,

设置FirstName =%〜1

设置姓名=%〜2

这条线应该有效,你需要一个小的改变。

设置“名字=%〜1”

设置“姓氏=%〜2”

在报价中包含完整的作业。 它将删除报价没有问题。 这是一个首选的方式,它可以解决参数引用中不需要的问题。