Как найти короткий путь к каталогу / файлу Windows?

Мне нужно использовать сокращенные имена путей для приложения, которое я использую. Например, мне нужен 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 — результат (ранее не задокументированной) функции контрольной суммы.
Оцените статью
clickpad.ru
Добавить комментарий