【问题标题】:Escaping outputs in CMD在 CMD 中转义输出
【发布时间】:2017-02-20 14:26:35
【问题描述】:

如果我运行返回带有 & 或其他具有特殊含义的字符的东西,并且我尝试在脚本中使用它,我将如何转义它?

例如,如果我与同一台计算机上的某人共享一个本地帐户,并且我的用户名是 John & Matt。将批处理文件放入具有如下内容的桌面目录中:

@ECHO OFF
echo %~dp0

它会返回如下内容:

C:\Users\John
The system cannot find the path specified.

如果我尝试继续,那么从那时起整个脚本就会中断。 如果有人知道让整个路径出现的方法,我将不胜感激。

编辑:我之前没有充分澄清这一点。对于那个很抱歉。不太擅长解释,但如果我尝试在变量中使用 %~dp0 并在其上堆叠更多内容,则类似于

SETLOCAL
set loc=%~dp0
rename "%~dp0Dir\Dir1\Dir2\File.txt" "Something.txt"

如果我在声明一个变量来解决这个问题时加上另一组引号,可能会混淆重命名命令。

我尝试创建的批处理文件基本上删除了批处理文件所在的文件,将其替换为批处理文件所在目录内的子文件夹中的另一个文件,并将其重命名为其他文件。

【问题讨论】:

  • 我不明白您的编辑。为什么将loc 设置为%~dp0?在这种情况下,您可以将%CD% 设置为%~dp0 并使用Ren Dir\Dir1\Dir2\File.txt" "Something.txt"
  • 我是创建批处理文件的新手,所以我不知道 %CD% 做了这样的事情。当我尝试创建一个新的批处理文件时,我会记住这一点。
  • 使用此语法:set "loc=%~dp0" -- 引号不会成为此处值的一部分,但某些特殊字符(如&)对cmd 正确隐藏...

标签: batch-file cmd


【解决方案1】:

如果您想可靠地回显值而不用引号括起来,那么您可以使用以下任一策略:

@echo off
:: Use a FOR loop
for %%F in ("%~dp0") do echo %%~F

:: Use delayed expansion.
:: Note that delayed expansion must be enabled after assignment of fullPath,
:: else any ! within path will be corrupted during the assignment.
set "fullPath=%~dp0"
setlocal enableDelayedExpansion
echo !fullPath!

【讨论】:

    【解决方案2】:
    @ECHO OFF
    echo %dp0
    

    将返回 dp0 - 我猜你的意思是 %~dp0 ;-)

    但是,echo "%~dp0" 将输出 C:\Users\John & Matt\...

    顺便说一下,它是\而不是/

    窗口:\

    Unix/Linux:/

    我不是迂腐,这有时会导致严重的问题(例如here)。

    【讨论】:

    • 有点仓促,没有纠正错误。对于那个很抱歉。我会编辑它。
    • @RoastChicken 实际上,这确实修复了错误。如果只是回声,用引号将变量括起来就可以了。
    • 对不起,如果我没有澄清,但我需要在变量中使用 %~dp0。加上引号会搞砸变量,因为我需要在它给我的路径上放更多东西。例如,我这样做:设置 loc=%~dp0 以后,我需要放入 %loc%Dir1\Dir2\Program.exe
    • @RoastChicken 好的,在这种情况下,如果没有看到更多代码,要帮助您并不容易。根据您对字符串的具体操作,您将不得不以不同的方式处理它。请向我们展示更多代码。最坏的情况:只需将 & 字符替换为 ~ 之类的东西,进行字符串构建操作并在末尾用 & 替换它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多