当前位置:  开发笔记 > 编程语言 > 正文

从批处理文件中的变量中删除双引号会导致CMD环境出现问题

如何解决《从批处理文件中的变量中删除双引号会导致CMD环境出现问题》经验,为你挑选了4个好方法。

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

我编写了一个批处理文件,它成功导入参数列表%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是第一个命令行参数,依此类推.



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是第一个命令行参数,依此类推.


@Imray - `:old = new`是变量扩展中的模式匹配和替换.使用```作为`old`而没有什么作为`new`,引号被删除,即使它们在中间,即使它们是不平衡的.

2> atzz..:

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

批处理文件参数中的引号问题通常通过删除引号来解决%~,然后在适当的时候手动将它们放回.

例如:

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

"%cmd%" %params%

注意周围的引号%cmd%.没有它们,带空格的路径将无法工作.

如果您可以发布整个批处理代码,可能会提供更具体的答案.



3> Vitaliy Ulan..:

花了很多时间尝试以简单的方式做到这一点.仔细查看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



4> 小智..:

我通常只是删除变量中的所有引号:

set var=%var:"=%

然后在我需要的地方再次应用它们,例如:

echo "%var%"

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有