Как перейти по символической / программной ссылке в cmd или PowerShell? - PullRequest
0 голосов
/ 17 февраля 2019

Мой поиск показал только, как создавать символические ссылки, используя mklink в cmd.Я видел некоторые вещи, говорящие об использовании readlink , но PowerShell и cmd не знают, что такое readlink , а cd , очевидно, не работает.Итак, как мне следовать одному?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Чтобы избежать недоразумений, связанных с вашим вопросом:

  • Windows ярлыки файлов (*.lnk файлы) , которые особенность Windows (GUI) shell , отличаются от символических ссылок ( символические ссылки ) , которые являются функцией файловой системы (NTFS) .

  • Ярлыки файлов - которые вас интересуют - сохраняют путь к файлу или папке, на которые они указывают , внутри файла , поэтому:

    • You не может напрямую cd к целевой папке ярлыка файла , потому что команды файловой системы, такие как cd, ничего не знают о содержимом файлов.
    • Вы должныпрочитайте содержимое файла ярлыка, чтобы определить его цель , которую затем можно передать cd или Set-Location (в PowerShell).
    • файлформат файла ярлыка является двоичнымОн может быть прочитан с помощью встроенного COM-компонента , который предоставляет функциональность оболочки Windows;Например, чтобы определить целевую папку для файла ярлыка с именем Samples.lnk и перейти в эту папку, используйте PowerShell:

      # NOTE: * Despite the name "CreateShortcut()", the method is also
      #         used to *read* shortcut files.
      #       * Prefixing the filename with "$PWD/" is needed in order
      #         to target a file in the current directory, because
      #         the method doesn't know what PowerShell's current dir. is.
      cd (New-Object -ComObject WScript.Shell).CreateShortcut("$PWD/Samples.lnk").TargetPath
      
  • Симлинки , напротив:

    • (обычно) прозрачно перенаправить на их target , то есть на элемент файловой системы(файл или папка), на которые они указывают.

    • Таким образом, вы можете использовать cd напрямую с символической ссылкой на папку , но учтите, что это все еще symlink , который показан.

    • To print цель символической ссылки - сродни тому, что readlinkУтилита работает на Unix-подобных платформах - использовать PowerShell;например, чтобы напечатать цель символической ссылки с именем Samples в текущем каталоге:

       (Get-Item Samples).Target
      
       # Or, after running `cd Samples`:
       (Get-Item .).Target
      
    • Обратите внимание, что не просто получить цель символической ссылки в cmd.exe, но есливы используете
      dir /al <link-path>*, в списке также будет показан целевой путь ссылки после имени, заключенного в [...];обратите внимание, что завершающий * необходим для показа информации о самой ссылке, а не о ее цели content ;обратите внимание, что, хотя и маловероятно, это может совпадать и с другими ссылками, начинающимися с того же пути.


В отличие от ярлыков, символьные ссылки все еще редкость в мире Windows , не в последнюю очередь потому, что до Windows 10 им неизменно требовались права администратора для создания;в Windows 10, если включен режим разработчика (администратором), даже пользователи без прав администратора / процессы без повышенных прав теперь могут создавать символические ссылки - см. https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/,, в котором также объясняется, почему символические ссылки могут увеличиватьсяиспользование в будущем .

0 голосов
/ 17 февраля 2019

На ваш вопрос я создал этот пакетный файл:

mkdir truedir
dir > truedir\fileone.txt
mklink /d symdir truedir
cd symdir
dir

И я не нашел проблем с получением содержимого символьной ссылки на каталог из командной строки.Также нет проблем с powershell 5.1 (win 10):

Get-ChildItem C:\Users\<user>\OneDrive\Desktop\test2\symdir

Можете ли вы дать нам пример кода (пакетный или powershell такой же), чтобы повторить вашу проблему?

...