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

30

Я пытаюсь преобразовать длинное имя файла в короткое имя файла (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. Как я могу это сделать?

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

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), однако, что вы спрашиваете путь к текущему каталогу.

У меня нет Windows под рукой, но попробуйте%filename:~s% (стиль, аналогичный обозначению подстроки,%filename:~0,1%). Если это сработает, я на это отвечу. Chris Morgan
@dbenham: нет? Ах хорошо. Это стоило попробовать. Chris Morgan
@ChrisMorgan - определенно нет. Не будет работать. dbenham
@dbenham - длинные имена файлов должны быть в кавычках, что может быть сложно передать в обычные процедуры, такие как psexec - см.stackoverflow.com/questions/24905546/… Allan Bowe
В любом случае, зачем вам короткое имя? Эту унаследованную функциональность лучше избегать, если в этом нет крайней необходимости. Harry Johnston

Ваш Ответ

2   ответа
4

который вы хотите преобразовать в 8.3

dir /x filename.txt

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

Довольно неэффективный способ сделать это. Я полагаю, что вызов пакетного сценария будет гораздо более эффективным.
41
cmd /c for %A in ("C:\Documents and Settings\User\NTUSER.DAT") do @echo %~sA
@ user1251007 - Какую версию Windows вы используете? Существует известная ошибка XP, связанная с именами 8.3 и модификатором ~ s:stackoverflow.com/questions/8354305/…
Это прекрасно работает на моем локальном диске, но не на подключенном сетевом диске. Есть идеи? user1251007
@ user1251007 - Кроме того, администратор может отключить создание 8.3 имен файлов для данного диска. Можете ли вы проверить, что DIR / X дает короткие имена файлов на вашем сетевом диске?
@ user1251007 - Я вполне уверен, что вы застряли, если только вы не можете заставить своего администратора включить короткие имена файлов на ваших сетевых дисках. Но короткие имена, вероятно, отключены по причине.
@AKhudairy - Этот вопрос был конкретно о решении для командной строки с помощьюcmd /c, В пакетном файле вы должны удвоить все проценты - все, что вам нужно, этоfor %%A in ("some path here\some file.ext") do echo %%~sA

Похожие вопросы