首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在批处理文件中删除变量中的双引号会导致CMD环境出现问题

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

Stack Overflow用户
提问于 2009-12-27 03:48:35
回答 12查看 181.2K关注 0票数 133

有没有人可以提供有效和安全的方法来删除批处理变量中的引号?

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

代码语言:javascript
复制
> "Susie Jo" (%1)  
> "Smith Barnes" (%2)  
> "123 E. Main St." (%3)  

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

代码语言:javascript
复制
> set FirstName=%1  
> set LastName=%2  
> set ShipAddr=%3  

变量的验证是由echo完成的。>echo。%FirstName%

回应。%LastName%

echo。%ShipAddr%

结果显示为

代码语言:javascript
复制
"Susie Jo"  
"Smith Barnes"  
"123 E. Main St."  

我需要删除所选变量上包含的引号。例如,FirstName和LastName在其他地方使用,不能包含引号。

在一个测试批处理文件中,我成功地在变量中使用~代字号消除了引号。

代码语言:javascript
复制
> set FirstName=%~1
> set LastName=%~2 

我以为我已经有了解决方案,但我很快就遇到了执行批处理文件时出现的异常行为。突然,CMD无法识别长路径语句。从完整路径正常执行批处理文件

代码语言:javascript
复制
> C:\Documents and Settings\Administrator\My Documents\Txt\batchtest\dataout.bat

返回

代码语言:javascript
复制
> 'C:\Documents' is not recognized as an internal or external command....

因此,将~代字号添加到即将到来的%1 %2...%n变量中似乎导致了一些更改。可能一些环境变量已经被改变了?

我还尝试使用FOR命令从变量中清除引号。这看起来很尴尬,我一直无法学习如何通过创建一个执行任务的变量列表来实现这一点:

如下所示:

代码语言:javascript
复制
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等)中插入~代字号的“简短”想法似乎影响了某些设置,并改变了CMD导航长路径名的方式。

  1. 我仍然在寻找一种干净而简单的方法来消除所选命名变量中的引号。

对那些更有经验的人的任何帮助都将不胜感激。我在这里已经到了极限了……需要一些指导!

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

代码语言:javascript
复制
:: 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  
EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2011-03-03 21:15:35

在字符串的末尾有一个额外的双引号,即将其添加回字符串的末尾(在从字符串中删除两个引号之后)。

输入:

代码语言:javascript
复制
set widget="a very useful item"
set widget
set widget=%widget:"=%
set widget

输出:

代码语言:javascript
复制
widget="a very useful item"
widget=a very useful item

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

代码语言:javascript
复制
set widget=%widget:"='%

注:要将单词"World“(不区分大小写)替换为BobB,请执行以下操作:

代码语言:javascript
复制
set widget="Hello World!"
set widget=%widget:world=BobB%
set widget

输出:

代码语言:javascript
复制
widget="Hello BobB!"

至于您的初始问题(将以下代码保存到批处理文件.cmd或.bat中并运行):

代码语言:javascript
复制
@ECHO OFF
ECHO %0
SET BathFileAndPath=%~0
ECHO %BathFileAndPath%
ECHO "%BathFileAndPath%"
ECHO %~0
ECHO %0
PAUSE

输出:

代码语言:javascript
复制
"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是第一个命令行参数,依此类推。

票数 221
EN

Stack Overflow用户

发布于 2009-12-27 04:10:36

你的结论(1)听起来是错的。一定有其他因素在起作用。

批处理文件参数中的引号问题通常是通过使用%~删除引号,然后在适当的地方手动放回引号来解决的。

例如:

代码语言:javascript
复制
set cmd=%~1
set params=%~2 %~3

"%cmd%" %params%

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

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

票数 46
EN

Stack Overflow用户

发布于 2010-12-02 21:15:17

我通常只用以下命令删除变量中的所有引号:

代码语言:javascript
复制
set var=%var:"=%

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

代码语言:javascript
复制
echo "%var%"
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1964192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档