Как сделать ярлык из CMD?

76

Как я могу создать ярлык файла ( .lnk) для другого файла или исполняемого файла, используя утилиты командной строки?

Шантану
источник
1
Кажется, нет простого способа сделать это. Некоторые люди написали инструменты, которые позволяют вам это делать; вот один из них . Поиск Google для «командной строки Windows создает ярлык» обнаруживает некоторые другие. (Я не пробовал ни одного из них.)
Кит Томпсон
@iglvzx - я не уверен, что редактирование вы сделали правильно. Я не думаю, что Shantanu нужен пакетный скрипт - это может быть любой способ создания * .lnk для другого * .exe файла.
alfasin
@alfasin Я добавил (.ink file), так как была некоторая путаница. Я пересмотрел вопрос, чтобы отразить комментарий Шантану. Хотя вы предоставляете способ создания ярлыков, он не отвечает на этот конкретный вопрос.
iglvzx
1
Используйте следующее: powershell "$ s = (New-Object -COM WScript.Shell) .CreateShortcut ('% userprofile% \ Desktop \ shortcut.lnk'); $ s.TargetPath = 'C: \ Windows \'; $ s .Save () «Очевидно, замените«% userprofile% \ Desktop \ shortcut.lnk »и« C: \ Windows \ »на ваш путь к ярлыку и путь к цели, соответственно.
Cowlinator
@cowlinator Как набрано, ваше предложение не работает.
Ploni

Ответы:

53

На этом сайте есть очень полезная информация: http://ss64.com/nt/shortcut.html

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

Но вы можете сделать это из скрипта VB:

Необязательные разделы в VBscript ниже закомментированы:

Set oWS = WScript.CreateObject("WScript.Shell")
sLinkFile = "C:\MyShortcut.LNK"
Set oLink = oWS.CreateShortcut(sLinkFile)
    oLink.TargetPath = "C:\Program Files\MyApp\MyProgram.EXE"
 '  oLink.Arguments = ""
 '  oLink.Description = "MyProgram"   
 '  oLink.HotKey = "ALT+CTRL+F"
 '  oLink.IconLocation = "C:\Program Files\MyApp\MyProgram.EXE, 2"
 '  oLink.WindowStyle = "1"   
 '  oLink.WorkingDirectory = "C:\Program Files\MyApp"
oLink.Save

Итак, если вам действительно нужно это сделать, то вы можете заставить свой пакетный файл записать VB-скрипт на диск, вызвать его и затем удалить снова. Например, вот так:

@echo off
echo Set oWS = WScript.CreateObject("WScript.Shell") > CreateShortcut.vbs
echo sLinkFile = "%HOMEDRIVE%%HOMEPATH%\Desktop\Hello.lnk" >> CreateShortcut.vbs
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> CreateShortcut.vbs
echo oLink.TargetPath = "C:\Windows\notepad.exe" >> CreateShortcut.vbs
echo oLink.Save >> CreateShortcut.vbs
cscript CreateShortcut.vbs
del CreateShortcut.vbs

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

Вот более полный фрагмент от анонимного участника (дополнен незначительным исправлением):

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET LinkName=Hello
SET Esc_LinkDest=%%HOMEDRIVE%%%%HOMEPATH%%\Desktop\!LinkName!.lnk
SET Esc_LinkTarget=%%SYSTEMROOT%%\notepad.exe
SET cSctVBS=CreateShortcut.vbs
SET LOG=".\%~N0_runtime.log"
((
  echo Set oWS = WScript.CreateObject^("WScript.Shell"^) 
  echo sLinkFile = oWS.ExpandEnvironmentStrings^("!Esc_LinkDest!"^)
  echo Set oLink = oWS.CreateShortcut^(sLinkFile^) 
  echo oLink.TargetPath = oWS.ExpandEnvironmentStrings^("!Esc_LinkTarget!"^)
  echo oLink.Save
)1>!cSctVBS!
cscript //nologo .\!cSctVBS!
DEL !cSctVBS! /f /q
)1>>!LOG! 2>>&1
Der Hochstapler
источник
1
Связанный: MSDN, Ссылки Shell
iglvzx
Это прекрасно работает для ярлыка в файл. Тем не менее, у меня странная проблема с использованием его для ярлыка на папку, когда моя переменная Esc_LinkTarget содержит переменную среды, пытающуюся получить его родительскую папку. (Что-то вроде% CD% \ .. не работает, но% CD% работает). Тип цели ярлыка становится «Файл» вместо «Папка»
EDM
1
@ Эдмунд Интересная проблема. У меня нет времени на это, но я бы предположил, что косая черта может изменить ситуацию.
Der Hochstapler
Примечание: если вы используете, SET Esc_LinkTarget=%0то вы должны удалить "изecho oLink.TargetPath = oWS.ExpandEnvironmentStrings^(!Esc_LinkTarget!^)
Black
Вместо того, чтобы создавать vbscript для каждого выполнения, было бы гораздо лучше использовать его Wscript.Argumentsдля получения аргументов командной строки ... lol
Sancarn
22

Вот аналогичное решение с использованием powershell (я знаю, что вы, вероятно, можете переписать весь пакетный файл в PS, но если вы просто хотите получить его ™) ...)

set TARGET='D:\Temp'
set SHORTCUT='C:\Temp\test.lnk'
set PWS=powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile

%PWS% -Command "$ws = New-Object -ComObject WScript.Shell; $s = $ws.CreateShortcut(%SHORTCUT%); $S.TargetPath = %TARGET%; $S.Save()"

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

Name             MemberType Definition                             
----             ---------- ----------                             
Load             Method     void Load (string)                     
Save             Method     void Save ()                           
Arguments        Property   string Arguments () {get} {set}        
Description      Property   string Description () {get} {set}      
FullName         Property   string FullName () {get}               
Hotkey           Property   string Hotkey () {get} {set}           
IconLocation     Property   string IconLocation () {get} {set}     
RelativePath     Property   string RelativePath () {set}           
TargetPath       Property   string TargetPath () {get} {set}       
WindowStyle      Property   int WindowStyle () {get} {set}         
WorkingDirectory Property   string WorkingDirectory () {get} {set} 
SmallClanger
источник
Трикс : Если вы считаете, что у вас есть лучший способ сделать это , просто опубликуйте его как новый ответ (при необходимости, ссылку на этот).
Скотт
17

Помимо shortcut.exe, вы также можете использовать версию командной строки NirCmd для создания ярлыка. http://nircmd.nirsoft.net/shortcut.html

Пока петля
источник
11
Я рекомендую почти все от NirSoft, это идеальный набор инструментов
Тот
10

Как насчет использования команды mklink? C: \ Windows \ System32> mklink Создает символическую ссылку.

MKLINK [[/ D] | [/ H] | [/ J]] Ссылка Target

    /D      Creates a directory symbolic link.  Default is a file
            symbolic link.
    /H      Creates a hard link instead of a symbolic link.
    /J      Creates a Directory Junction.
    Link    specifies the new symbolic link name.
    Target  specifies the path (relative or absolute) that the new link
            refers to.
Майк
источник
10
Хорошая идея, но символические ссылки ведут себя немного иначе, чем ярлыки. Если я создаю ярлык для решения Visual Studio, он правильно открывает все проекты с относительными изменениями. Однако, если я открою то же решение через символическую ссылку, рабочим каталогом будет путь, по которому находится символическая ссылка, а не путь, на который она ссылается.
Вальтер Стабош
7

После всех обсуждений, которые мы провели здесь, это мое предлагаемое решение: скачать: http://optimumx.com/download/Shortcut.zip распаковать его на свой рабочий стол (например). Теперь предположим, что вы хотите создать ярлык для файла с именем scrum.pdf (также на рабочем столе):
1. откройте CMD и перейдите в папку рабочего стола
2. запустите:Shortcut.exe /f:"%USERPROFILE%\Desktop\sc.lnk" /a:c /t:%USERPROFILE%\Desktop\scrum.pdf

на рабочем столе будет создан ярлык sc.lnk, который будет указывать на оригинальный файл (scrum.pdf).

alfasin
источник
Это не ярлык; это просто командный файл, который вызывает указанную программу.
Кит Томпсон
1
ярлык - это то, что вы запускаете из окон, так как он использовал CMD в заголовке и поставил тег «командная строка», я предположил, что он хочет запустить его из CMD. Пакетный файл является эквивалентом «ярлыка» Windows, когда вы запускаете в CMD (dos like) env.
alfasin
2
Поскольку он поставил «ярлык (файл .lnk)» в тексте вопроса, я предположил, что он хочет создать настоящий ярлык.
Кит Томпсон
1
извините за ясность, я хотел, чтобы на моем рабочем столе была иконка, которую я сделал в cmd, которая была бы ярлыком для exe-файла
Shantanu
теперь, когда я наконец понял (медленный мыслитель - что ты можешь сделать ...), я изменил свой ответ. Надеюсь, это поможет!
Альфасин
0

Эта бесплатная программа имеет необходимые функции http://www.nirsoft.net/utils/nircmd2.html : (пример с указанной веб-страницы) "Create a shortcut to Windows calculator under Start Menu->Programs->Calculators nircmd.exe shortcut "f:\winnt\system32\calc.exe" "~$folder.programs$\Calculators" "Windows Calculator"

Мой пример, чтобы попробовать: ярлык nircmd.exe "c: \ windows \ system32 \ calc.exe" "~ $ folder.desktop $" "Калькулятор Windows"

Goldie
источник
0

Я знаю, что эта тема старая, но я хотел предложить простое решение, которое сработало для меня.

Сначала я скопировал файл .ico на мой диск C :. Затем я создал ярлык на рабочем столе и установил значок на файл ico на диске C :. Затем я скопировал .ico и ярлык в сетевой ресурс, к которому у моих пользователей есть доступ. Оказавшись там, я написал следующий командный файл, чтобы скопировать ico и .url на рабочий стол пользователей Windows 7. Это создает ярлык на рабочем столе всех пользователей и сохраняет файл значков, который я установил при создании ярлыка. Я надеюсь, что это поможет кому-то.

@echo off
Copy "\\sharename\folder\icon.ico" "C:\"
pause
copy "\\sharename\folder\shortcut.url" "C:\Users\All Users\Desktop"
pause
Michele
источник
Если это подход, который лучше использовать, лучше создать фактический ярлык (.lnk), в который будет вставлен значок. Этот ярлык можно скопировать везде.
LPChip