如何在批处理脚本中向字符串添加引号

3

基本上,我有一个变量,其中包含一个字符串,该字符串是卸载程序的路径。有时当变量返回时,它会返回类似于

"C:/path to uninstall file/uninstall.exe"

有时它可能会返回其他结果

MsiExec.exe /I{regkeyhere}

这两个都可以,但是当类似下面这样的东西返回时就有问题了。
C:/path to uninstall file/uninstall.exe

在文件路径中,如果没有引号,那么调用函数会失败。有没有办法检查变量是否以"C:"开头,如果是,则在字符串的开头和结尾添加引号?如果它以除了"C:"之外的任何其他内容开头,则无所谓,只有当它具有带空格的文件路径时才会出现问题。我尝试了几种不同的字符串替换方法,但由于某种原因它总是出错。

抱歉 :( 但你应该使用Powershell、Basic或Perl而不是批处理!由于某种原因删除了我的答案! - Endoro
1
为什么你要删除你的回答?而且这是在政府计算机上进行的,根据政策限制了我们能做和不能做的事情。所以在这个问题上我没有选择,只能利用手头的工具完成工作。无论如何,另一个人已经回答了这个问题,并且他的修复方法有效。 - Flynn
1个回答

2

使用插入符号来转义引号:

if "%variable:~0,2%"=="C:" set variable=^"%variable%^"

编辑:我意识到如果引号已经存在会有错误,因此这段代码将创建一个测试变量(删除引号)以先测试变量。如果没有空格,则此代码也不会添加引号。

如果以C:开头,(如果有空格,则不添加引号,否则添加引号)。

set test=%uninstallStr:"=%
if "%test:~0,2%"=="C:" (
    if "%test: =%"=="%test%" (
      set uninstallStr=%test%
    ) else (
      set uninstallStr=^"%test%^"
    )
)

编辑2:我意识到像<>这样的毒瘤字符会带来更多问题,因此在处理之前,此代码将首先转义这些毒瘤字符。

set ^"uninstallStr=^"C:\Program Files ^<x86^>\Price Check by AOL\uninstall.exe^"^"
echo %uninstallStr%

set "test=%uninstallStr:"=%"
set "test=%test:<=^<%"
set "test=%test:>=^>%"
if "%test:~0,2%"=="C:" (
    if "%test: =%"=="%test%" (
      set uninstallStr=%test%
    ) else (
      set uninstallStr=^"%test%^"
    )
)

echo %uninstallStr%
pause

1
这就是我最终得出的代码:if "%uninstallStr:~0,2"=="C:" set uninstallStr=^"%uninstallStr%^",只不过它没有添加引号。 - Flynn
1
你在~0,2"==之间没有添加百分号。应该是if "%uninstallStr:~0,2%"=="C:" set uninstallStr=^"%uninstallStr%^" - user2033427
1
好的,只有一个问题,如果文件路径中没有空格,似乎无法使用引号卸载产品。那么在添加引号之前,我如何检查字符串是否以 C: 开头并包含空格? - Flynn
1
添加了新代码,应该解决了问题。如果你想让它适用于任何驱动器,你可以通过将第二行替换为 if "%test:~1,1%"==":" ( 来修改它以查找冒号作为第二个字符。 - user2033427
1
似乎正在工作,尽管Sublime不喜欢打开引号而不关闭它的语法哈哈。 - Flynn
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接