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

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

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

короче.летучая мышь!--15-->:

@echo OFF
echo %~s1

вызов short.bat C:Documents and SettingsUserNTUSER.DAT возвращает C:DOCUM~1USERNTUSER.DAT

, Я не люблю лишних .bat-файл для этого. Я лучше позвоню cmd.exe со всей командой из сценария ruby. Как я могу это сделать?

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

short1.летучая мышь!--15-->:

@echo OFF
SET filename="C:Documents and SettingsUserNTUSER.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.летучая мышь!--15--> работает, как я могу преобразовать это в один-лайнер, который можно назвать cmd.exe c ...?

есть еще один вопрос (как получить путь DOS вместо пути Windows), однако этот человек специально просит путь текущего каталога.

2 ответов


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

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

dir /x filename.txt

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