Создание ярлыка и символической ссылки через powershell

Недавно мне понадобилось создать через Deployment Workbench в Task Sequense ярлыки на рабочем столе пользователей при установке Windows 10. Казалось что может быть проще? На самом деле пришлось повозиться.

Я всегда думал, что символическая ссылка и обыкновенный ярлык в проводнике Windows — это одно и тоже. Чем же отличаются ярлык и символическая ссылка?

  1. для создания символической ссылки требуются права администратора
  2. если скопировать символическую ссылку в другую директорию, то вместо символической ссылки окажется файл, на который ссылается ссылка, но без расширения. Например сделаем так:
    cp "Internet Explorer" .\test2\
    и вот что можно увидеть в папке test2
  3. В проводнике Windows отображает эти ресурсы по-разному:
    Поэтому для сценариев развертывания Windows лучше всего подойдет возможность создания ярлыков: их можно и скопировать и прав администратора они не будут запрашивать. Создавать только их сложнее: необходимо вписать следующие строчки в ваш скрипт:
    $Install_Path = "C:\Users\AVIvanov\Desktop\test"
    $WSShell = New-Object -com WScript.Shell
    $ShortcutPath = Join-Path -Path $Install_Path -ChildPath "Internet Explorer.lnk"
    $NewShortcut = $WSShell.CreateShortcut($ShortcutPath)
    $NewShortcut.TargetPath = "C:\Program Files\Internet Explorer\iexplore.exe"
    $NewShortcut.Save()
    Так мы создадим ярлык на Internet Explorer в папке «test» на моем рабочем столе.

    Если нужно создать ярлык на URL-адрес, то это будет выглядеть немного по другому:
    $Install_Path = "C:\Users\AVIvanov\Desktop\test"
    $WSShell = New-Object -com WScript.Shell
    $ShortcutPath = Join-Path -Path $Install_Path -ChildPath "Яндекс.url"
    $NewShortcut = $WSShell.CreateShortcut($ShortcutPath)
    $NewShortcut.TargetPath = "https://yandex.ru"
    $NewShortcut.Save()

    Ещё пример: скрипт, который будет открывать в Google Chrome сайт mail.ru:
    $Install_Path = "C:\Users\onix\Desktop"
    $WSShell = New-Object -com WScript.Shell
    $ShortcutPath = Join-Path -Path $Install_Path -ChildPath "MAILRU.lnk"
    $NewShortcut = $WSShell.CreateShortcut($ShortcutPath)
    $NewShortcut.TargetPath = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
    $NewShortcut.Arguments = "https://mail.ru"
    $NewShortcut.Save()

    Если кому-то все же понадобится создать именно символическую ссылку через powershell, то такая возможность появилась совсем недавно в Windows 10 1703:
    New-Item -Path "C:\Users\AVIvanov\Desktop\test\Internet Explorer" -value "C:\Program Files\Internet Explorer\iexplore.exe" -ItemType symboliclink -в той же папка «test» на рабочем столе

Создание ярлыка и символической ссылки через powershell: 8 комментариев

  1. То есть либо мы указываем путь к локальному файлу, либо адрес в сети ($NewShortcut.TargetPath = «…»). А как вписать и то, и это?
    В свойствах ярлыка любого браузера можно в поле «Объект» через пробел от указанного в кавычках пути к файлу запуска браузера дописать адрес интернет-ресурса. Тогда будет сразу открываться заданная ссылка.

  2. Доброго, есть такая хитрая ссылка на сетевое подключение, которая располагается по пути
    UserProfile%\AppData\Roaming\Microsoft\Windows\Network Shortcuts\
    Если добавить соединение с помощью мастера добавления сетевого расположения, в этой папке создается ссылка на него (соединение), причем это ссылка на папку (хотя если посмотреть ее свойства то она отличается от обычной ссылки на папку) а в папке находится файл target.lnk. Вопрос можно создать такую ссылку с помощью PowerShell Ссылку target.lnk в обычную созданную мной папку в UserProfile%\AppData\Roaming\Microsoft\Windows\Network Shortcuts\ создавал по вашей инструкции, работает но не совсем корректно, т.к. это все же обычная папка, а что это за ссылка на сетевую папку (соединение) найти не могу…

  3. Это и в Windows 7 и 8.1 и 10 (сейчас проверил) в проводнике выделяем [Этот компьютер] правой кнопкой вызывается контекстное меню, там пункт [Добавить новый элемент в сетевое окружение] — Запускается мастер добавления сетевого расположения надо, (это только Win10, закрыть окно предлагающее подключение к Интернету) Выбрать другое сетевое расположение, там можно указать подключение либо к сетевой шаре (\\Server\share) либо FTP, после отработки которого и создается данный ярлык в указанной выше папке….
    %UserProfile%\AppData\Roaming\Microsoft\Windows\Network Shortcuts\ а так же в списке с лева в проводнике под [Этот компьютер] появляется папка с Введенным нами названием а значок папки либо папка с сетевым входом если локальное соединение, либо еще значок добавляется глобусом, если FTP.
    Идея в том что мне нужно групповыми политиками раскидать по рабочим станциям определенные шары в том числе FTP, пробовал создавать на одном компьютере и скопировать на другой через скрипт, но команды copy или xcopy не подходят т.к. они при выполнении превращают соединение в реальную папку а это по ходу какая то хитрая папка если посмотрите ее свойства увидите и поведение ее будет не таким….

    1. Оказывается все просто. Этот тот же самый обычный ярлык, только имеющий атрибут на файле «ReadOnly». Если его заменить на «Normal», то он превращается в папку, внутри которой находится обычный ярлык с указанием пути. Чтобы понять о чем я написал, выполни команду Set-ItemProperty -Path «$env:APPDATA\Microsoft\Windows\Network Shortcuts\Test» -Name Attributes -Value Normal , где Test — название ярлыка и ты увидишь что он распался на обычную папку с ярлыком внутри. чтобы все вернуть назад выполняем Set-ItemProperty -Path «$env:APPDATA\Microsoft\Windows\Network Shortcuts\Test» -Name Attributes -Value Readonly. Таким образом тебе перед копированием в скрипте нужно менять атрибут файла на «Normal» и скопировать папку и ярлык внутри него и после копирования вернуть его на «ReadOnly».
      А если не хочется с этим возиться, то воспользуйся robocopy c ключом /COPYALL, он копирует как надо, главное когда указываешь директорию назначения нужно указывать папку, например так: robocopy «C:\Users\onix\AppData\Roaming\Microsoft\Windows\Network Shortcuts\Test» C:\Test /COPYALL

  4. К стати добавлю, если эту папку, соединение копировать самим проводником или Total Commander ом то папка копируется без изменения ее свойств….

  5. Кажется нашел способ, использовать буфер обмена, попробовал скопировать сию ссылку в буфер обмена и вставить в нужную мне папку %UserProfile%\AppData\Roaming\Microsoft\Windows\Network Shortcuts\ все получилось
    ————————
    PowerShell
    Добраться до буфера обмена можно с помощью .Net класса Clipboard. Для того, чтобы этот класс стал доступен, сначала загрузим сборку: Add-Type -AssemblyName PresentationCore
    После чего выведем статические методы класса командой:
    [Windows.Clipboard] | Get-Member -Static
    Но пока не могу разобраться ни как загрузить сию ссылку из указанного места, скорее всего это
    SetDataObject, ни как выгрузить в нужное мне место GetDataObject
    не могу найти информации, вот только пока что нашел
    https://windowsnotes.ru/powershell-2/rabotaem-s-buferom-obmena-iz-komandnoj-stroki/

Добавить комментарий

Войти с помощью: