批参数%〜s1给出错误的8.3短名称

我正在尝试在Windows XP中编写一个batch file,该文件接受完全限定的path名​​并输出8.3短名称版本…

@echo off echo "%~s1" 

我碰到一个特定的情况下,这将输出一个不正确的path和文件…

 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]”部分,则生成的string将是原始input文件的有效path。

这似乎是在文件名中使用括号([])的问题。 如果我在同一个目录中创build一个文件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中的错误? 有谁知道是否有一个解决方法,允许batch file正确处理这个文件名?

这不是你的代码中的错误,这是一个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