Мне нужно использовать сокращенные имена путей для приложения, которое я использую. Например, мне нужен C: PROGRA ~ 1
в отличие от C: Program Files
. Программа не может обрабатывать пробелы и не принимает пути в кавычках (например, "C: Program Files"
).
Если это помогает, я использую Windows 7. При необходимости я могу получить доступ к любой версии, начиная с XP.
Пуск и введите cmd
в поле выполнения. Запустите cmd и используйте cd
, чтобы перейти к интересующей вас папке:
cd
Затем
dir/xC: > dir/x13/10/2011 09:14 AM DOCUME ~ 1 Documents and Settings13/10/2011 09 : 05 AM Программные файлы PROGRA ~ 1
Создайте файл bat в каком-нибудь удобный каталог, тогда вы можете скопировать + вставить короткий путь из этого пути.
Вы можете просто запустить command.com
и продолжать делать cd
и в текущий каталог.
В пакетных сценариях Windows % ~ s1
заменяет параметры пути на короткие имена. Создайте этот командный файл:
@ECHO OFFecho% ~ s1
Я назвал свой shortNamePath.cmd
и назовите его так:
C: > shortNamePath "c: Program Files (x86) Android android-sdk" c: PROGRA ~ 2 Android ANDROI ~ 1
Вот версия, которая использует текущий каталог, если не указан параметр:
@ECHO OFFif '% 1' == '' (% 0.) Else echo% ~ s1
Вызывается без параметров:
C : Program Files (x86) Android android-sdk> shortNamePathC: PROGRA ~ 2 Android ANDROI ~ 1
Использование SET
и именованная переменная
Командная строка Windows имеет некоторые соглашения об обработке переменных с пробелами в их значениях, которые довольно сложно изучить и понять, особенно если у вас есть Unix фон. Вы можете сделать
SET TESTPATH = c: Program Files (x86) Android android-sdk
(с помощью без кавычек) или
SET "TESTPATH = c: Program Files (x86) Android android-sdk "
(обратите внимание на неинтуитивное размещение кавычек); затем
CALL: testargs "% TESTPATH%" ︙: testargsecho% ~ s1goto: eof
6
Вот однострочник :
cmd/c для% A в ("C: Program Files") do @echo% ~ sA
Разбивка :
-
cmd/c
— запускает новый экземпляр интерпретатора команд Windows, выполняет команду, указанную строка, а затем завершается -
для параметра %% в (set) do
команде — условно выполнить команду несколько раз. -
echo
— отображение сообщений на экране. Символ@
аналогичен символуECHO OFF
, применяемому только к текущей строке. -
% ~ s
— расширенный путь содержит только короткие имена.
Источники :
- Документация CMD
- Параметры пакета
3
«Краткое имя» на самом деле является старым соглашением об именах в DOS 8.3, поэтому все каталоги будут состоять из первых 6 букв, за которыми следует ~ 1
при условии, что существует только одно имя, которое соответствует, например:
C: ABCDEF ~ 1 - C: ABCDEFG Я КАТАЛОГ C: BCDEFG ~ 1 - C: BCDEFGHIJKL M Другой каталог
вот единственное исключение
C: ABCDEF ~ 1 - C: ABCDEFG Я DIRECTORYC : ABCDEF ~ 2 - C: ABCDEFGHI и каталог
5
Я нашел очень удобный способ решить короткий путь к текущему каталогу (или чему-то еще), если у вас установлен Powershell.
Просто откройте powershell в текущем каталоге
-
в cmd windows type powershell
-
, если у вас есть папка, открытая в графическом интерфейсе, вы можете ввести cmd.exe или powershell.exe прямо в адресной строке папки.
Затем дайте команду
(New-Object -ComObject Scripting.FileSystemObject) .GetFolder ("."). ShortPath
Источник информации: [https://gallery.technet.microsoft.com/scriptcenter/Get-ShortName-90a49303]
1
Как и в ответе Ивана Шварца, вы можете заменить «C: Program Files» на % cd%
, чтобы получить текущий каталог:
cmd/c для% A в ("% cd%") do @echo% ~ sA
0
В качестве альтернативы вы можете использовать этот замечательный небольшой инструмент под названием PathCopyCopy
За несколько щелчков мыши вы можете получить длинный и короткий путь буквально к любой папке из контекстного меню, например:
Щелкните правой кнопкой мыши в папке назначения => Копировать путь => Короткий путь.
Готово. Он будет скопирован в буфер обмена.
preview
C: Users abcd> subst z: "c: Program Files (x86) Microsoft Office365 Tools Microsoft Visual Studio 14.0" C: Users abcd> substZ: : => C: Program Files (x86) Microsoft Office365 Tools Microsoft Visual Studio 14. 0 "
Это самый простой способ, который я использовал при работе с файлами с пробелами, и он доступен из проводника файлов, также имеет те же права доступа.
для пользователей Windows 10 НИ ОДИН из этих решений не работал на моих ноутбуках с Windows 10, поскольку ключ в реестре запрещал создание коротких имен ..:
- Alt + r, введите regedit , чтобы открыть редактор реестра.
- перейдите в HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control FileSystem
- найдите ключ NtfsDisable8dot3NameCreation : если значение равно 0x00000001 (1), ваша система не создает короткое имя для вашей папки/файла.
- в этом случае double нажмите кнопку NtfsDisable8dot3NameCreation ,
- введите 0 в поле данных
это не ретро active 🙂 Я имею в виду, что вам нужно воссоздать папку/файл, к которому вам нужно получить доступ из старого приложения … может быть, возможно что-то умное, хотя я еще не знаю.
это похоже, они ввели этот ключ для ускорения операций файловой системы.
source microsoft: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000 -server/cc959352 (v = technet.10)? redirectedfrom = MSDN
@echo offfor %% i in (% *) do echo %% ~ sipause
Сохраните его как shortpath.bat, а затем перетащите на него файлы Результат:
C: PROGRA ~ 1C: PROGRA ~ 2C: PROGRA ~ 3C: Python27C: UsersC: Windows Нажмите любую клавишу, чтобы продолжить. . .
Вызов его с помощью shortpath
тоже нормально.
Я установил модули узлов, запустив npm install
в шаблоне. При попытке удалить эти папки окна не позволяют нам удалить их, так как путь слишком длинный, чтобы его можно было обработать.
После небольшого исследования я подумал, что это будет правильная моя собственная работа. фрагмента кода для переименования папок с корня на лист, чтобы он также генерировал исключение нарушения для этой попытки.
У меня это работает. Ниже приведен код проекта C #.
public static int directoryCounterIndex = 0; public static void Main (string [] args) {string dirPath = @ "D: Studies MeanStack a nodem"; RenameDirectories (dirPath); } приватный статический void RenameDirectories (строка dirPath) {directoryCounterIndex + = 1; var newPath = Path.GetDirectoryName (dirPath) + Path.DirectorySeparatorChar + directoryCounterIndex.ToString (); Directory.Move (dirPath, newPath); var subDirectories = Каталог. GetDirectories (newPath); foreach (подкаталог var в подкаталогах) {RenameDirectories (подкаталог); }}
1
Просто замените пробелы на
% 20
Так все «переводятся», а пробелы переходят в % 20.
Если вам действительно нужно много, просто откройте браузер и введите что-нибудь вроде
test "; ($ #
2
Как создаются короткие имена файлов в Windows?
В настоящее время я использую следующую подпись P/Invoke для получения короткого имени файла обычного файла Windows:
[DllImport ("kernel32.dll", CharSet = CharSet.Auto)] public static extern int GetShortPathName ([MarshalAs (UnmanagedType.LPTStr)] строковый путь, [MarshalAs (UnmanagedType. LPTStr)] StringBuilder shortPath, int shortPathLength);
В настоящее время — он работает без каких-либо проблем, но я заметил кое-что довольно странное:
Я знаю, что Windows использует следующие соглашение о сокращении имени файла :
Сократите имя до 6 символов (без расширения)
Добавьте тильду (~
)
Добавить целое число без знака, которое указывает индекс соответствия (начиная с 1)
Добавить расширение исходного файла
Таким образом, имя файла C: abcdefghijklmn.txt
должно быть доступно под коротким именем C: abcdefg ~ 1.txt
. (Что работает отлично.)
Теперь о странной части : я недавно выполнил небольшой поиск в моем музыкальном каталоге для определенных аудиофайлов. Получился результат:
. Rammstein & Tatu - Moscow.mp3. Rammstein - Asche zu Asche.mp3. Rammstein - Der Meister.mp3. Rammstein - Du Hast.mp3. Rammstein - Eifersucht.mp3. Rammstein - Feuer Frei.mp3. Rammstein - Führe Mich.mp3. Rammstein - Haifisch.mp3 ...
И тот же поиск в сокращенной записи:
. RA8E17 ~ 1.MP3. RA23A6 ~ 1.MP3. RAMMST ~ 1.MP3. RA0CAE ~ 1.MP3. RAMMST ~ 2.MP3. RAMMST ~ 3.MP3. RAMMST ~ 4.MP3. RA6BAA ~ 1.MP3 ...
Мой вопрос is: Почему Windows генерирует такие «случайные» префиксы перед тильдой (например, RA23A6
или RA0CAE
)?
Microsoft не документирует это, но Википедия делает:
8.3 filename:
Хотя нет обязательного алгоритма для Создавая имя 8.3 из LFN, Windows использует следующее соглашение:
1. Если LFN — это прописные буквы 8.3, LFN вообще не будет сохраняться на диске.
- Пример:
TEXTFILE.TXT
2. Если LFN равно 8. 3 в смешанном регистре, LFN будет хранить имя в смешанном регистре, а имя 8.3 будет его версией в верхнем регистре.
- Пример :
TextFile.Txt
становитсяTEXTFILE.TXT
.3. Если имя файла содержит символы, недопустимые в имя 8.3 (включая пробелы, которые были запрещены соглашением, но не API-интерфейсами) или любая часть слишком длинная, имя удаляется из недопустимых символов, таких как пробелы и дополнительные точки. Другие символы, такие как
+
, заменяются на подчеркивание_
и в верхнем регистре. Затем удаленное имя обрезается до первых 6 букв базового имени, за которым следует тильда, за которой следует одна цифра, за которой следует точка.
, за которой следуют первые 3 символа расширения. .
- Пример:
TextFile1.Mine.txt
становитсяTEXTFI ~ 1. TXT
(илиTEXTFI ~ 2.TXT
, еслиTEXTFI ~ 1.TXT
уже существует).ver + 1.2.text
становитсяVER_12~1.TEX
.4. Начиная с Windows 2000, если уже существует по крайней мере 4 файла или папки с одинаковыми начальными 6 символами в их коротких именах, вырезанный LFN вместо этого усекается до первых 2 букв базового имени (или 1, если базовое имя состоит только из 1 буквы) , за которыми следуют 4 шестнадцатеричные цифры, полученные из недокументированного хеша имени файла, за которыми следует тильда, за которой следует одна цифра, за которой следует точка
.
, за которой следуют первые 3 символа расширения .
- Пример:
TextFile.Mine.txt
становитсяTE021F ~ 1.TXT
.
Как упоминал Джоуи, недокументированный хэш имени файла был реконструирован .
Это потому, что очень примитивная схема использования счетчика и префикса работает только до определенного числа файлов. При увеличении количества файлов Windows переключается на более короткий префикс и хэш. Кто-то на самом деле перепроектировал хэш вместе с небольшими пояснениями:
Если вы не знаете, как работают имена файлов 8.3, вот краткое изложение.
- Все точки, кроме той, которая отделяет имя файла от расширения, удаляются — a.testing.file.bat превращается в atestingfile.bat.
- Некоторые специальные символы, такие как +, превращаются в символы подчеркивания, а другие отбрасываются. Имя файла в верхнем регистре. 1 + 2 + 3 Hello World.exe превращается в 1_2_3HELLOWORLD.EXE.
- Расширение файла обрезается до 3 символов, и (если оно длиннее 8 символов) имя файла обрезается до 6 символов, за которыми следует на ~ 1. SomeStuff.aspx превращается в SOMEST ~ 1.ASP.
- Если это вызовет коллизию, вместо него используется ~ 2, за которым следуют ~ 3 и ~ 4.
- Вместо перехода к ~ 5 имя файла обрезается до 2 символов, заменяемое шестнадцатеричной контрольной суммой длинного имени файла — SomeStuff. aspx превращается в SOBC84 ~ 1.ASP, где BC84 — результат (ранее не задокументированной) функции контрольной суммы.