【问题标题】:How to pass a file with space in the name to command FC?如何将名称中带有空格的文件传递给命令 FC?
【发布时间】:2018-06-14 14:38:45
【问题描述】:

我有一个包含命令FC 的差异脚本,因此我只需在其上放置两个文件:

FC /L /N "%1" "%2" > diff.out.txt 2> diff.err.txt

它工作正常,但如果其中一个文件的名称中有空格... 例如,我的文件路径是 C:\Users\joH1\Desktop\file_with a_space.txtC:\Users\joH1\Desktop\file_2.txt,我收到错误消息(对不起本地化):

FC : commutateur non valide

FC : impossible d'ouvrir C:\USERS\JOH1\DESKTOP\FILE_WITH - Ce fichier ou dossier n'existe pas

因此,文件名被拆分为两个单独的参数,即使路径被引用

为了找出它的来源,我在脚本中添加了几行代码:

echo %1
echo %2
FC /L /N "%1" "%2" > diff.out.txt 2> diff.err.txt
pause

我得到了 echos 的正确输出(尽管 args 没有被引用!):

"C:\Users\joH1\Desktop\file_with a_space.txt"
"C:\Users\joH1\Desktop\file_2.txt"

我什至尝试使用 dir 来确保 echo 没有合并拆分的 args,并且我得到了正确的结果(文件被识别并列出 => 名称未拆分)。

所以;我猜FC 是罪魁祸首。

有没有办法告诉它不要分割文件名? (应该像引号一样?)
如果可能的话,我想要一种与拖放兼容的方式,并且不是重命名文件而不使用空格...

提前致谢!

【问题讨论】:

  • 不,不是fc 导致问题;您正在将文件拖放到脚本中,因此 Windows/cmd 可能会根据需要添加引号(因此当存在空格或特殊字符时),使用 "%1" 时会加倍;使用"%~1" 是答案所示的最佳解决方案,因为~ 在引用参数之前删除了潜在的引号......

标签: windows batch-file arguments parameter-expansion


【解决方案1】:
FC /L /N "%~1" "%~2" > diff.out.txt 2> diff.err.txt

应该阅读您的文件。我假设您的参数只是双引号,并且它们不包含发布的 `

【讨论】:

  • @joH1,作为这个答案的扩展;您将双引号加倍,这意味着FC 命令在看到C:\Users\joH1\Desktop\file_with a_space.txt"" ""C:\Users\joH1\Desktop\file_2.txt"" 之前看到一个空参数""
  • 是的,反引号是复制粘贴操作失败。我现在不能检查这个(在'nux'上回家)所以我明天会在办公室做(UTC + 0200)。已经谢谢你了!
  • @Compo 即使在 bash 上也能正常工作:var="\"var\"; echo $var"var" 相呼应,所以我最终得到了……双双引号……四引号?
  • @joH1,我们不在 bash 上,所以我不确定您的评论是否相关,除非您从 bash shell 将参数发送到 Windows 批处理文件。也就是说,您上面的命令有一个开头的双引号和两个转义的内部双引号,不是吗?
  • @Compo 这只是一个示例,表明无论系统如何,嵌入的双引号最终都会出现在变量的扩展中,当我将它翻译成 Bash 时,这在我看来很明显(我更常用到)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2019-07-02
  • 2016-04-21
  • 2013-06-15
  • 2011-01-17
  • 2019-06-24
  • 1970-01-01
相关资源
最近更新 更多