Пакетный параметр% ~ s1 дает неверное 8.3 короткое имя - PullRequest
6 голосов
/ 02 декабря 2011

Я пытаюсь написать командный файл в 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 Ответ

8 голосов
/ 03 декабря 2011

Это не ошибка в вашем коде, это ошибка XP!
В Vista тот же код работает.

Это похоже на повреждение буфера.
Это зависит отдлина последнего имени каталога, последние символы копируются в «короткое имя».

И это происходит только в том случае, если в имени файла содержится один или несколько символов из [];,+=<space>

Aкороткий тестовый пример

@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
...