【问题标题】:Expanding short name from argument从参数扩展短名称
【发布时间】:2013-03-25 15:44:58
【问题描述】:

我知道通过使用 %~s1 我可以将第一个参数扩展为短路径 (ref)

现在我有一个奇怪的问题,文件扩展名由于某种原因被添加到这个缩短的路径中。例如,考虑这个简单的批处理文件,名为test.cmd

@echo %1
@echo %~s1

如果我通过这个参数:

C:\>test.cmd "C:\Documents and Settings\zzz\My Documents\My Music\Library\I AWAKE\[2008] The Core\I Awake - The Cor.m4a"
"C:\Documents and Settings\zzz\My Documents\My Music\Library\I AWAKE\[2008] The Core\I Awake - The Cor.m4a"
C:\DOCUME~1\zzz\MYDOCU~1\MYMUSI~1\Library\IAWAKE~1\_2008_~1\I Awake - The Cor.m4am4a

您可以看到“m4a”已添加到返回的缩短路径中。

有人知道为什么会这样吗?


更新

如果有人愿意,这里是如何复制它(我使用相同的文件夹名称,因为我不知道它与使用的某些字符有关):

C:\Temp>md "My Documents\Library\I AWAKE\[2008] The Core\"
C:\Temp>echo test > "My Documents\Library\I AWAKE\[2008] The Core\I Awake - The Core.dat"
C:\Temp>test.cmd "c:\Temp\My Documents\Library\I AWAKE\[2008] The Core\I Awake - The Core.dat"

请注意,文件名不会缩短,尽管它存在。如果不需要缩短文件名,会发生以下情况:

它与I AWAKE 文件夹名称有关。如果我更改其他文件夹名称,我会得到错误的结果,但如果我将 I AWAKE 更改为其他名称(不以 I ... 开头),我会得到正确的结果

【问题讨论】:

  • 我试过了,但没有得到额外的分机行为。您应该指定正在运行的 Windows 操作系统版本。此外,如果路径确实存在,它似乎只会缩短路径......所以对我来说它缩短了 C:\DOCUME~1\ 但不是“我的文档”或之后......。
  • 这里也不会出错(Win 7)C:\>test2.cmd "C:\Documents and Settings\zzz\My Documents\My Music\Library\I AW AKE\[2008] The Core\I Awake - The Cor.m4a" "C:\Documents and Settings\zzz\My Documents\My Music\Library\I AWAKE\[2008] The Core\I Awake - The Cor.m4a" C:\DOCUME~1\zzz\My Documents\My Music\Library\I AWAKE\[2008] The Core\I Awake - The Cor.m4a
  • 已确认。 %~s1 只会在路径的那部分实际存在时缩短它。
  • 对不起,这里无法重现,没有添加额外的扩展。
  • 请显示来自type test.cmd的输出。

标签: windows batch-file cmd


【解决方案1】:

经过一番研究,我发现只有一个网站与此问题有关:http://www.pcreview.co.uk/forums/long-filename-short-filename-conversion-incorrect-t3693699.html。错误发生在内部有两个“长名称”的路径中,字符长度也起作用:

C:>md "12345 6789\t st"

C:>echo test> "12345 6789\t st\test.dat"

C:>for /r "12345 6789" %i in (*.*) do @echo %~si
C:\123456~1\TST~1\test.datt

这里又出现了一个t。如果第一个路径名变长,扩展名也会越来越长:

 C:>for /r "12345     6789" %i in (*.*) do @echo %~si
 C:\123456~1\TST~1\test.datt.dat

dir /x 命令不受影响。

【讨论】:

  • 看起来问题不在于“内部有两个'长名称'的路径”,至于其他这样的路径我没有问题。问题仍然是我们如何确定此命令何时会失败,然后使用一些解决方法。或者当然,完全避免使用它。
  • 我认为没有安全性。此功能总是会失败。在 for 循环中,您可以安全地使用:for /f "tokens=4" %i in ('dir "*.*" /s /a-d /x^|findstr [0-9]:') do @echo %~i.
猜你喜欢
  • 2010-11-28
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2013-01-09
相关资源
最近更新 更多