powershell code --diff在文件名包含"&“符号时失败

rn0zuynd  于 2023-02-23  发布在  Shell
关注(0)|答案(1)|浏览(159)

我在尝试从命令行使用Visual Studio代码对两个文件执行比较时遇到了一个相当令人费解的错误。我在云中有一个文本文件,其中保存了一些与工作相关的注解。我需要解决与编辑该文件的其他客户端的冲突。通常情况下,这只发生在连接丢失时,但不知何故,我发现自己不得不解决很多问题,因此在这个和其他使用diff之间我将使用常规语法。它看起来像这样:
code --diff "R&D (cloud conflict 2-5-23).txt" "R&D.txt"
我的文件名中碰巧有一个'&',这个命令在VS代码中启动通常的双向diff,并读取第一个文件名,没有问题,但没有读取第二个'&',在VS代码中产生的diff选项卡看起来像这样:
R&D (cloud conflict 2-25-23).txt <-> R
右边的"R"不存在,所以看起来"&"需要按字面处理。
没问题,让我们看看反斜杠\是否是可接受的转义参数...
code --diff "R\&D (cloud conflict 2-5-23).txt" "R\&D.txt"
不是。同样的问题。实际上它输出了更奇怪的东西:🤔 In fact this outputs something even stranger:
代码差异选项卡:&D (cloud conflict 2-25-23).txt <-> R
使用shell输出:'D.txt' is not recognized as an internal or external command, operable program or batch file.
我还尝试了用胡萝卜符号"^"作为转义参数,达到类似的效果。我只是在第一个文件中包含它,编辑器仍然认为第二个文件名只是"R"。
VS代码命令行集成的帮助文件除了简短的描述外,没有太多关于--diff参数的内容,我希望得到一些关于按字面处理字符串或转义字符的信息。也许是我需要的另一个参数,或者这与shell有更多的关系。
我觉得很奇怪,它可以读取第一个完整的文件名,但在第二个'&'中断。更奇怪的是,如果一个假定的转义字符包括在第二个文件名,它也将省略。😵
现在我所能做的就是重命名文件,这是一个扫兴. ♂我有VS代码版本1.75.0在Windows 10家庭最新版本/构建,我使用的PowerShell版本5.1.19041.2364.🤷‍♂️ I have VS Code version 1.75.0 on Windows 10 Home latest version/build and I'm using PowerShell version 5.1.19041.2364.
编辑:事实证明,这个问题肯定与PowerShell有关。我终于能够在常规命令提示符下成功运行这个命令了。(在运行diff命令之前,只需在PowerShell窗口中键入"cmd"和Enter即可)。我碰巧将此命令作为PowerShell脚本的一部分运行。如果可能的话,我可能必须弄清楚如何从PowerShell脚本内部运行CMD命令。我不确定。如果不确定,我需要弄清楚当命令到达"&"字符时,PowerShell对我的命令到底做了什么。🤔 If not, I need to figure out what exactly PowerShell is doing to my command when it reaches the '&' character.

webghufk

webghufk1#

    • TL;医生**

您需要解决方法

cmd /c 'code --diff "R&D (cloud conflict 2-5-23).txt" "R&D.txt"'

或者,使用--%,停止解析标记:

code --diff "R&D (cloud conflict 2-5-23).txt" --% "R&D.txt"
  • 注意:--%有一些基本的限制,特别是不能引用PowerShell变量-请参见this answer
    • 背景资料**:
  • 根本原因是code * 作为批处理文件 code.cmd)实现,并且cmd.exe(执行批处理文件的解释器) 不适当地 * 解析其参数列表 *,就好像它们是从cmd.exe会话内部提交的 *。
  • PowerShell,在根据 * 其 * 规则执行参数解析后,必须在Windows后台 * 重建 * 进程命令行,并且-合理地-将"R&D.txt"作为逐字R&D.txt放在进程命令行上,前提是参数值 * 不包含空格 *。
  • 结果是cmd.exe将其命令行上的 * unquoted * R&D.txt参数解释为包含 * metacharacter * &,这是其 * 命令序列运算符 *,从而导致调用中断。
  • 考虑到cmd.exe,* 遗留 * Windows shell,不太可能收到修复,积极维护的PowerShell (Core) 7+版本可以 * 作为一种礼貌 * 补偿cmd.exe的不当行为。
  • GitHub issue #15143中已经提出了这样做,但是,唉,看起来这些适应性将不会被实现。

相关问题