Пакетный параметр%~s1 дает неверное 8.3 короткое имя
Я пытаюсь написать командный файл в 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 ответ
Это не ошибка в вашем коде, это ошибка 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