从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 )
注意:如果您传递的参数通常以空格分隔,则只会得到双引号。
- 设置小部件=“一个非常有用的项目”
- 设置小部件
- widget =“一个非常有用的项目”
- 设置小部件=%小部件:“=%”
- 设置小部件
- 设置小部件=一个非常有用的项目“
尾随的报价"
在第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”
在报价中包含完整的作业。 它将删除报价没有问题。 这是一个首选的方式,它可以解决参数引用中不需要的问题。