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

时间:2009-12-26 19:48:35

标签: variables batch-file cmd quotes

11 个答案:

答案 0 :(得分:179)

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

输入:

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 :(得分:35)

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

批处理文件参数中的引号问题通常通过删除带%~的引号然后在适当的位置手动放回来解决。

E.g:

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

"%cmd%" %params%

请注意%cmd%周围的引号。没有它们,带空格的路径将无效。

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

答案 2 :(得分:9)

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

答案 3 :(得分:8)

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

set var=%var:"=%

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

echo "%var%"

答案 4 :(得分:3)

这听起来像一个简单的错误,你在不应该使用的地方使用%〜。使用if%〜不会从根本上改变批处理文件的工作方式,它只是在单一情况下从字符串中删除引号。

答案 5 :(得分:3)

我从这个link中学到了,如果你使用的是XP或更高版本,那么它只能单独使用:

SET params = %~1

我无法在Windows 7上获得任何其他解决方案。

要迭代它们,我这样做了:

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

注意:如果传入通常以空格分隔的参数,则只能获得双引号。

答案 6 :(得分:0)

  1. 设置widget =“非常有用的项目”
  2. 设置小部件
  3. widget =“非常有用的项目”
  4. set widget =%widget:“=%”
  5. 设置小部件
  6. set widget =一个非常有用的项目“
  7. 第4行中的尾随引用"正在向字符串添加引用"。它应该删除。 第4行的语法以%

    结尾

答案 7 :(得分:0)

  

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

     
    

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

  
     

返回

     
    

' C:\文件'不被视为内部或外部命令......

  

你的整个问题都存在。 CMD无法从命令行了解文件名中的空格,因此它认为您正在尝试传递

  

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

作为

的参数
  

" C:\文件"

程序。

您需要引用它来运行路径中包含空格的批处理文件:

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

会起作用。

答案 8 :(得分:0)

@echo off

Setlocal enabledelayedexpansion

Set 1=%1

Set 1=!1:"=!

Echo !1!

Echo "!1!"

Set 1=

使用或不使用引号进行演示,无论原始参数是否有引号。

如果您想测试参数的存在,该参数可能在引号中,也可能不在引号中,请将此行放在上面的回声之前:

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

但是,如果检查是否存在可能有或没有引号的文件,那么它是:

如果EXIST"!1!"转到othersub

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

答案 9 :(得分:0)

所有答案都已完成。但是想要添加一件事,

  

设置FirstName =%~1

     

设置LastName =%~2

这条线应该有效,你需要做一些小改动。

  

设置“FirstName =%~1”

     

设置“LastName =%~2”

在引号内包含完整的作业。它将删除引号而不会出现问题。这是一种首选的赋值方式,可以修复参数中带引号的不需要的问题。

答案 10 :(得分:0)

简单的波浪号语法仅适用于删除传递到批处理文件中的命令行参数周围的引号

SET xyz=%~1

以上批处理文件代码会将xyz设置为在第一个参数剥离开头和结尾引号(如果存在)时传递的任何值。

但是,这种简单的波浪号语法不适用于未作为参数传递的其他变量

对于所有其他变量,您需要使用扩展替换语法,该语法要求您 指定要删除的前导和后继字符。实际上,我们指示您删除第一个和最后一个字符,而不要看它到底是什么。

@SET SomeFileName="Some Quoted file name"
@echo %SomeFileName% %SomeFileName:~1,-1%

如果我们想在删除第一个字符和最后一个字符之前对其进行引用,我们将需要一些额外的代码,如下所示:

@SET VAR="Some Very Long Quoted String"
If aa%VAR:~0,1%%VAR:~-1%aa == aa""aa SET UNQUOTEDVAR=%VAR:~1,-1%