Можно ли создать ярлык Windows с помощью PHP? - PullRequest
5 голосов
/ 27 апреля 2009

Я пишу сценарий, чтобы привести в порядок кучу носителей, распределенных по моим жестким дискам, и он довольно хорошо работает дома (на моем Mac), поскольку я использую символические ссылки в каталоге, чтобы создать впечатление, что все организованы в одном месте, в то время как фактические данные распределены по 4 дискам.

К сожалению, мне приходится использовать Windows на работе, и, конечно, там нет поддержки символических ссылок до PHP 5.3 (и я предполагаю, что для этого требуется Vista, поскольку именно тогда впервые появился инструмент командной строки "mklink").

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

Ответы [ 3 ]

7 голосов
/ 27 апреля 2009

Благодаря приведенному выше ответу я обнаружил, что вы действительно можете вызывать COM из php, вот мой первый черновик замены символической ссылки ():

if (! function_exists('symlink')) {
    function symlink($target, $link) {
        if (! substr($link, -4, '.lnk'))
            $link .= '.lnk';

        $shell = new COM('WScript.Shell');
        $shortcut = $shell->createshortcut($link);
        $shortcut->targetpath = $target;
        $shortcut->save();
    }
}
2 голосов
/ 27 апреля 2009

Существует поддержка точек соединения (аналогично символическим ссылкам UNIX) до Vista.

Вам необходим инструмент linkd из набора ресурсов Windows (скачать бесплатно).

Ярлыки - это просто файлы. Вы можете создавать файлы ярлыков с помощью COM WScript API. Пример кода делает это с помощью Python. Если существует библиотека для PHP, которая позволяет вам взаимодействовать с COM, вы должны иметь возможность сделать что-то подобное.

import win32com.client
import winshell

userDesktop = winshell.desktop()
shell = win32com.client.Dispatch('WScript.Shell')

shortcut = shell.CreateShortCut(userDesktop + '\\Zimbra Webmail.lnk')
shortcut.Targetpath = r'C:\Program Files\Mozilla Firefox\firefox.exe'
shortcut.Arguments = 'http://mysite.com/auth/preauth.php'
shortcut.WorkingDirectory = r'C:\Program Files\Mozilla Firefox'
shortcut.save()
0 голосов
/ 24 мая 2010

Для записи, точки соединения в NTFS действительно только для каталогов. Я имел большой успех, используя linkd.exe для создания виртуальной файловой системы, но есть несколько вещей, о которых нужно знать:

  • Невозможно установить связь между томами (т. Е. Пытаться создать ссылку в C: которая указывает на местоположение в D: не будет работать)
  • Кажется, что несвязанные вещи время от времени удаляют данные в месте назначения. Резервное копирование / перемещение данных перед удалением ссылки!
  • Точки соединения испытывают те же проблемы при совместном использовании данных по сети, что и подключенные тома - иногда они просто не работают удаленно. Они также, кажется, случайным образом (то есть иногда) наследуют некоторые разрешения общего ресурса из исходной папки, независимо от того, как вы настраиваете целевую ссылку.

Приветствую полезные посты о создании файлов .lnk, именно то, что я хотел ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...