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

Мне нужно использовать сокращенные пути для приложения, которое я использую. Например мне нужно C:\PROGRA~1\ в отличие от C:\Program Files, Программа не может обрабатывать пробелы и не принимает кавычки (например, "C:\Program Files").

Если это помогает, я использую Windows 7. Я могу получить доступ к любой версии начиная с XP, если это необходимо.

10 ответов

Решение

Начните и введите cmd в поле запуска. Запустите cmd и используйте cd чтобы попасть в интересующую вас папку:

cd \

затем

dir /x

C:\>dir /x

13/10/2011  09:14 AM    <DIR>          DOCUME~1     Documents and Settings
13/10/2011  09:05 AM    <DIR>          PROGRA~1     Program Files

Создайте файл bat в некотором удобном каталоге, затем вы можете скопировать + вставить короткий путь из этого пути.

Вы могли бы просто бежать command.com и продолжай делать cd Команды для вашего текущего каталога тоже.

В пакетных сценариях Windows %~s1 расширяет параметры пути до коротких имен. Создайте этот пакетный файл:

@ECHO OFF
echo %~s1

Я назвал мой shortNamePath.cmd и назовите это так:

C:\> shortNamePath "c:\Program Files (x86)\Android\android-sdk"
c:\PROGRA~2\Android\ANDROI~1

Вот версия, которая использует текущий каталог, если не был указан параметр:

@ECHO OFF
if '%1'=='' (%0 .) else echo %~s1

Вызывается без параметров:

C:\Program Files (x86)\Android\android-sdk> shortNamePath
C:\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%"
        ︙

:testargs
echo %~s1
goto :eof

Вот один вкладыш:

cmd /c for %A in ("C:\Program Files") do @echo %~sA

Разбивка:

cmd /c - Запускает новый экземпляр интерпретатора команд Windows, выполняет команду, указанную в строке, а затем завершает работу.

for %%parameter in (set) do команда - Условно выполнить команду несколько раз.

echo - Отображать сообщения на экране. @ символ такой же, как ECHO OFF применяется только к текущей строке.

%~s - Расширенный путь содержит только короткие имена.

Источники:

Я нашел очень удобный способ для определения короткого пути к текущему каталогу (или к чему-либо еще), если у вас установлен Powershell.

Просто откройте PowerShell в текущем каталоге

  • в cmd окна типа powershell

  • если у вас есть открытая папка в графическом интерфейсе, вы можете ввести cmd.exe или powershell.exe прямо в адресную строку папки.

Тогда дайте команду

(New-Object -ComObject Scripting.FileSystemObject).GetFolder(".").ShortPath

Происхождение информации: [ https://gallery.technet.microsoft.com/scriptcenter/Get-ShortName-90a49303]

"Короткое имя" на самом деле является старым соглашением об именах DOS 8.3, поэтому все каталоги будут первыми 6 буквами, за которыми следует ~ 1, при условии, что существует только одно имя, которое соответствует, например:

C:\ABCDEF~1 - C:\ABCDEFG Я ЕСТЬ КАТАЛОГ
C:\BCDEFG~1 - C:\BCDEFGHIJKL M Другой каталог

здесь единственное исключение

C:\ABCDEF~1 - C:\ABCDEFG Я ЕСТЬ КАТАЛОГ
Каталог C:\ABCDEF~2 - C:\ABCDEFGHI

Подобно ответу Ивана Шварца, вы можете заменить "C:\Program Files" на %cd% чтобы получить текущий каталог:

cmd /c for %A in ("%cd%") do @echo %~sA  

C:\Users\abcd>subst z: "c:\Program Files (x86)\ Инструменты Microsoft Office365 \ Microsoft Visual Studio 14.0"

C: \ Users \ abcd> subst Z:: => C: \ Program Files (x86) \ Microsoft Office365 Tools \ Microsoft Visual Studio 14.0 "Это самый простой способ, который я использовал при работе с файлами с пробелами, и он доступен из Проводник тоже имеет все те же права доступа.

для окон 10 пользователей NONE из этих решений не работал на моих окнах 10 ноутбука, так как ключ в реестре запрещает создание shortnames..:

  • Alt + r, введите regedit, чтобы открыть редактор реестра.
  • перейдите в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
  • искать NtfsDisable8dot3NameCreation ключ: если значение 0x00000001(1), то ваша система не создает для короткое имя папки / файла
  • в этом случае дважды щелкните по ключу NtfsDisable8dot3NameCreation,
  • введите 0 в поле данных

это не имеет обратной силы:) Я имею в виду, что вам нужно воссоздать папку / файл, к которому вам нужно получить доступ из вашего старого приложения... возможно, что-то умное возможно, хотя я еще не знаю.

похоже, они ввели этот ключ для ускорения операций файловой системы.

источник microsoft: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc959352(v=technet.10)?redirectedfrom=MSDN

Кроме того, вы можете использовать этот удивительный маленький инструмент под названием PathCopyCopy

За несколько кликов вы можете получить длинный и короткий путь буквально любой папки из контекстного меню, например:

Щелкните правой кнопкой мыши в папке назначения => Копировать путь => Короткий путь.

Готово. Он будет скопирован в ваш буфер обмена.

предварительный просмотр

@echo off
for %%i in (%*) do echo %%~si
pause

Сохраните его как shortpath.bat, а затем перетащите на него файлы. Его результат:

C:\PROGRA~1
C:\PROGRA~2
C:\PROGRA~3
C:\Python27
C:\Users
C:\Windows
Press any key to continue . . .

Называя это с shortpath <file path> тоже нормально.

Просто замените пробелы на

%20

Это способ, которым вещи "переводятся", и пробелы переходят в%20.

Если вам действительно нужно много, просто откройте браузер и введите что-то вроде

test ";($#< and find the word test, and see that the space is %20 and so on...

Я установил узловые модули, запустив npm install на шаблоне. При попытке удалить эти папки окна не позволяют нам удалить их, поскольку путь слишком длинный, чтобы его можно было обработать.

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

Меня устраивает. Ниже приведен код для проекта C#.

    public static int directoryCounterIndex = 0;
    public static void Main(string[] args)
    {
        string dirPath = @"D:\Studies\MeanStack\a\nodem";
        RenameDirectories(dirPath);
    }

    private static void RenameDirectories(string dirPath)
    {
        directoryCounterIndex += 1;
        var newPath = Path.GetDirectoryName(dirPath) + Path.DirectorySeparatorChar + directoryCounterIndex.ToString();
        Directory.Move(dirPath, newPath);
        var subDirectories = Directory.GetDirectories(newPath);
        foreach (var subDirectory in subDirectories)
        {
            RenameDirectories(subDirectory);
        }
    }
Другие вопросы по тегам