任何人都可以帮助有效和安全地从批处理变量中删除引号吗?
我编写了一个批处理文件,它成功导入参数列表%1,%2,%3等,并将它们放入命名变量中.其中一些参数包含多个单词,因此用双引号括起来.
> "Susie Jo" (%1) > "Smith Barnes" (%2) > "123 E. Main St." (%3)
接下来将这些%变量放在命名变量中:
> set FirstName=%1 > set LastName=%2 > set ShipAddr=%3
变量验证由echo完成.
echo.%FirstName%
echo.%LastName%
echo.%ShipAddr%
结果显示为
"Susie Jo" "Smith Barnes" "123 E. Main St."
我需要消除所选变量的包含引号.例如,FirstName和LastName在别处使用,不得包含引号.
在测试批处理文件中,我成功地使用变量中的~tilde字符来消除引号.
> set FirstName=%~1 > set LastName=%~2
我以为我有解决方案,但我很快就遇到了执行批处理文件的异常行为.突然间,CMD无法识别长路径的声明.从完整路径正常执行批处理文件
> C:\Documents and Settings\Administrator\My Documents\Txt\batchtest\dataout.bat
回报
> 'C:\Documents' is not recognized as an internal or external command....
因此,似乎在即将到来的%1%2 ...%n变量中添加了〜tilde字符已经引起了一些变化.可能有些环境变量已被改变?
我还尝试使用FOR命令通过各种尝试清除变量中的引号.这似乎很尴尬,我无法通过创建执行任务的变量列表来学习如何实现这一目标:
这样的事情:
for %%g in (%FirstName% %LastName%) do ( set %%g=%%~g set %%h=%%~h set FirstName=%%~g set LastName=%%h echo.%FirstName% %LastName% )
我想我有两个问题.
1)我在传入的%1%2变量(%~1等)中插入~tottde的'简短而甜蜜'的想法似乎影响了一些设置,并改变了CMD导航长路径名的方式.
2)我仍然在寻找一种简洁明了的方法来消除所选命名变量的引号.
对那些经验丰富的人的任何帮助都将非常感激.我在这里结束了我的技能......请需要一些指导!
编辑12/26/2009 13:36 PST整个批处理文件:
Blockquote
:: dataout.bat
:: revision 12/25/2009添加〜tilde 到传入的%变量以消除嵌入的"引号.
::使用命令行参数写入地址列表
::为QBooks写入数据输出列表IIF import
:: writes
用于测试的RUI :: sample命令行字符串的商家订单数据
:: listmail [firstname] [lastname] ["地址字符串"] ["城市字符串"] [州] [zip] [订单#] [PurchDate] [Regname] ["FirstName LastName"] [TransactionID] [PaymentMethod] [Total] [ProductID] [Qty] [Price_Each] [PackPrep] [Shipping] [CommissionPmt] [Invoice#]
:: example:dataout Bellewinkle Moose"123 Green Forest Way" "温哥华"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
::将%n命令行参数转换为字符串变量
集($ 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
班次
设置($ PaymentMethod)=%~9
班次
设置($ Total)=%~9
班次设置($ ProductIdentifier)=%~9
班次
设置($ Quantity)=%~9
班次
设置($ Price_Each )=%~9
班次
设置($ Pack_Prep)=%~9
班次
设置($ Shipping)=%~9
班次
设置($ ServiceFee)=%~9
班次
设置($折扣)=%~9
班次
设置($发票) )=%~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
::分配帐户b y服务提供商
IF/i%($ PaymentMethod)%==亚马逊应收账款SET _QBAcct = Amazon.com
:: 12-25-2009为多功能性添加了第二个Amazon pm't方法
IF/i%($ PaymentMethod)%==亚马逊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)%==邮件设置_QBAcct =%($ RegistrationName)%
IF/i%($ PaymentMethod)%== AMER SET _QBAcct = Auth/Net
IF/i%($ PaymentMethod)%== DISC SET _QBAcct = Auth/Net
::基于QBAccount指定Rep指示符
IF/i%($ PaymentMethod)%==亚马逊应收账款SET _Rep =亚马逊
:: 12-25-2009为通用性增加了第二个Amazon pm't方法
IF/i% ($ PaymentMethod)%==亚马逊SET _Rep =亚马逊
IF/i%($ PaymentMethod)%== MAST SET _Rep = BlueZap
IF/i%($ PaymentMethod)%== MasterCard SET _Rep = BlueZap
IF/i%($ PaymentMet hod)%== Visa SET _Rep = BlueZap
IF/i%($ PaymentMethod)%== PayPal SET _Rep = BlueZap
IF/i%($ PaymentMethod)%== On Account SET _Rep = RB
IF/i%($ PaymentMethod )%==邮件设置_Rep = RB
IF/i%($ PaymentMethod)%== AMER SET _Rep = BlueZap
IF/i%($ PaymentMethod)%== DISC SET _Rep = BlueZap
::检查重复的地址数据
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在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
::在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)%发票%($ TransactionID)%% _QBAcct%应收帐款%($总计)%% _兑换%>> writeIIF.txt
回显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
::写出自定义变量解析的折扣价:
echo%($ ProductIdentifier) %%($ Price_Each)%%($ Quantity)%?>> writeIIF.txt
goto:EOF
:WRITE_DEFA
:写入从产品数据
echo%($ ProductIdentifier)%%($ UnitPrice)%%($ Quantity)%解析的默认价格?>> writeIIF.txt
goto:EOF
:: 3秒延迟
:: TYPE NUL | CHOICE.COM/N/CY/TY,3> NUL
:EOF
小智.. 185
最后你有一个额外的双引号,它将它添加回字符串的末尾(从字符串中删除两个引号后).
输入:
set widget="a very useful item" set widget set widget=%widget:"=% set widget
输出:
widget="a very useful item" widget=a very useful item
注意:要使用单引号替换双引号,请执行以下操作:
set widget=%widget:"='%
注意:要用BobB替换"World"(不区分大小写)一词,请执行以下操作:
set widget="Hello World!" set widget=%widget:world=BobB% set widget
输出:
widget="Hello BobB!"
就您的初始问题而言(将以下代码保存到批处理文件.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
是脚本名称和路径.
%1
是第一个命令行参数,依此类推.
最后你有一个额外的双引号,它将它添加回字符串的末尾(从字符串中删除两个引号后).
输入:
set widget="a very useful item" set widget set widget=%widget:"=% set widget
输出:
widget="a very useful item" widget=a very useful item
注意:要使用单引号替换双引号,请执行以下操作:
set widget=%widget:"='%
注意:要用BobB替换"World"(不区分大小写)一词,请执行以下操作:
set widget="Hello World!" set widget=%widget:world=BobB% set widget
输出:
widget="Hello BobB!"
就您的初始问题而言(将以下代码保存到批处理文件.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
是脚本名称和路径.
%1
是第一个命令行参数,依此类推.
你的结论(1)听起来不对.必须有一些其他因素在起作用.
批处理文件参数中的引号问题通常通过删除引号来解决%~
,然后在适当的时候手动将它们放回.
例如:
set cmd=%~1 set params=%~2 %~3 "%cmd%" %params%
注意周围的引号%cmd%
.没有它们,带空格的路径将无法工作.
如果您可以发布整个批处理代码,可能会提供更具体的答案.
花了很多时间尝试以简单的方式做到这一点.仔细查看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
我通常只是删除变量中的所有引号:
set var=%var:"=%
然后在我需要的地方再次应用它们,例如:
echo "%var%"