Подтвердить что ты не робот

Преобразование длинного имени файла в короткое имя файла (8.3) с помощью cmd.exe

Я пытаюсь преобразовать длинное имя файла в короткое имя файла (8.3) в Windows.

Пакетный файл с аргументом командной строки работает по назначению:

short.bat:

@echo OFF
echo %~s1

вызов short.bat C:\Documents and Settings\User\NTUSER.DAT возвращает C:\DOCUM~1\USER\NTUSER.DAT

Однако мне не нравится иметь дополнительный .bat файл для этого. Я бы предпочел называть cmd.exe всей командой из ruby ​​script. Как я могу это сделать?

В качестве промежуточного шага я пытался жестко кодировать путь в пакетном файле, но это не работает:

short1.bat:

@echo OFF
SET filename="C:\Documents and Settings\User\NTUSER.DAT"
echo %filename%
echo %~sfilename%

echo %filename% работает, но echo %~sfilename% дает следующую ошибку:

The following usage of the path operator in batch-parameter
substitution is invalid: %~sfilename%

For valid formats type CALL /? or FOR /?

Если short1.bat работает, как я могу преобразовать его в однострочный, который можно вызвать с помощью cmd.exe \c ...?

Возникает еще один вопрос (как получить путь к DOS вместо пути к Windows), однако тот, кто задает путь к текущему каталогу, задает особый вопрос.

4b9b3361

Ответ 1

cmd /c for %A in ("C:\Documents and Settings\User\NTUSER.DAT") do @echo %~sA

Ответ 2

Замените файл filename.txt на имя файла, которое вы хотите преобразовать в 8.3

dir /x filename.txt

Затем вам нужно разбить результат на пробел в качестве разделителя (\ s в регулярном выражении). Тогда значение с ~ является вашим коротким именем файла. Если для вашего имени имя краткое, то вы не найдете строку, содержащую ~.