批处理参数%~s1给出了不正确的8.3短文件名。

7

我正在尝试在Windows XP中编写一个批处理文件,它接受完全限定的路径名并输出8.3短名称版本...

@echo off
echo "%~s1"

我遇到了一个特定的情况,输出的路径和文件是不正确的...
C:\>test.bat "C:\Documents and Settings\angus\Local Settings\Temporary Internet Files\Content.IE5\2JSTM34V\62[1].ja2"
"C:\DOCUME~1\angus\LOCALS~1\TEMPOR~1\Content.IE5\2JSTM34V\62_1_~1.JA2M34V\62[1].ja2"

请注意上面的输出(“C:\DOCUME~1\angus\LOCALS~1\TEMPOR~1\Content.IE5\2JSTM34V\62_1_~1.JA2M34V\62[1].ja2”)不存在。然而,如果我从该输出中删除“.JA2M34V\ 62 [1]”部分,则生成的字符串将成为原始输入文件的有效路径。
这似乎是文件名中使用方括号([])的问题。如果我在相同的目录中创建一个名为62.ja2的文件,则输出将是正确的...
C:\>test.bat "C:\Documents and Settings\angus\Local Settings\Temporary Internet Files\Content.IE5\2JSTM34V\62.ja2"
"C:\DOCUME~1\angus\LOCALS~1\TEMPOR~1\Content.IE5\2JSTM34V\62.ja2"

这是Windows的一个漏洞吗?有没有人知道是否有解决方法可以使批处理文件正确处理这个文件名?

1个回答

9

这不是你代码的错误,而是XP系统的错误!
在Vista系统中,相同的代码可以正常工作。

看起来像是一种缓冲区损坏。
它取决于最后一个目录名称的长度,最后的字符被复制到“短名称”中。

只有当文件名中有一个或多个字符不属于[];,+=<space>时,才会发生此问题。

以下是一个简短的测试案例:

@echo off
setlocal EnableDelayedExpansion
set myDir=
set myFile=a[1].bat
set map=123456789ABCDEFGHIJKLMNOPQRSTUVW

for /L %%n in (0 1 26) do (
  set "myDir=!myDir!!map:~%%n,1!"
  md !myDir!
  echo dummy > "!myDir!\!myFile!"
  echo Dir=!myDir!
  for %%X in ("!myDir!\!myFile!") do echo   %%~sX
  echo(
  del "!myDir!\!myFile!" > nul
  rd !myDir!
)

上一行的结果
Dir=123456789A
  C:\Projekte\batch\123456~1\A_1_~1.BAT

Dir=123456789AB
  C:\Projekte\batch\123456~1\A_1_~1.BATt

Dir=123456789ABC
  C:\Projekte\batch\123456~1\A_1_~1.BATat

Dir=123456789ABCD
  C:\Projekte\batch\123456~1\A_1_~1.BATbat

Dir=123456789ABCDE
  C:\Projekte\batch\123456~1\A_1_~1.BAT.bat

Dir=123456789ABCDEF
  C:\Projekte\batch\123456~1\A_1_~1.BAT].bat

Dir=123456789ABCDEFG
  C:\Projekte\batch\123456~1\A_1_~1.BAT1].bat

Dir=123456789ABCDEFGH
  C:\Projekte\batch\123456~1\A_1_~1.BAT[1].bat

Dir=123456789ABCDEFGHI
  C:\Projekte\batch\123456~1\A_1_~1.BATa[1].bat

Dir=123456789ABCDEFGHIJ
  C:\Projekte\batch\123456~1\A_1_~1.BAT\a[1].bat

Dir=123456789ABCDEFGHIJK
  C:\Projekte\batch\123456~1\A_1_~1.BATK\a[1].bat

Dir=123456789ABCDEFGHIJKL
  C:\Projekte\batch\123456~1\A_1_~1.BATKL\a[1].bat

Dir=123456789ABCDEFGHIJKLM
  C:\Projekte\batch\123456~1\A_1_~1.BATKLM\a[1].bat

Dir=123456789ABCDEFGHIJKLMN
  C:\Projekte\batch\123456~1\A_1_~1.BATKLMN\a[1].bat

Dir=123456789ABCDEFGHIJKLMNO
  C:\Projekte\batch\123456~1\A_1_~1.BATKLMNO\a[1].bat

Dir=123456789ABCDEFGHIJKLMNOP
  C:\Projekte\batch\123456~1\A_1_~1.BATKLMNOP\a[1].bat

Dir=123456789ABCDEFGHIJKLMNOPQ
  C:\Projekte\batch\123456~1\A_1_~1.BATKLMNOPQ\a[1].bat

Dir=123456789ABCDEFGHIJKLMNOPQR
  C:\Projekte\batch\123456~1\A_1_~1.BATKLMNOPQR\a[1].bat

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