从批处理文件创建EXE的快捷方式
如何从批处理文件创建EXE的快捷方式。从批处理文件创建EXE的快捷方式
我试图
call link.bat "c:\program Files\App1\program1.exe" "C:\Documents and Settings\%USERNAME%\Desktop" "C:\Documents and Settings\%USERNAME%\Start Menu\Programs" "Program1 shortcut"
,但它并没有奏效。
link.bat可以在 http://www.robvanderwoude.com/amb_shortcuts.html
您的链接指向Windows 95/98版本,我猜你至少有Windows 2000或XP。你应该试试NT版本here。
或者使用一个小的VBScript可以从命令行调用:
set objWSHShell = CreateObject("WScript.Shell")
set objFso = CreateObject("Scripting.FileSystemObject")
' command line arguments
' TODO: error checking
sShortcut = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(0))
sTargetPath = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(1))
sWorkingDirectory = objFso.GetAbsolutePathName(sShortcut)
set objSC = objWSHShell.CreateShortcut(sShortcut)
objSC.TargetPath = sTargetPath
objSC.WorkingDirectory = sWorkingDirectory
objSC.Save
将文件保存为createLink.vbs和调用它得到什么您最初试图:
cscript createLink.vbs "C:\Documents and Settings\%USERNAME%\Desktop\Program1 shortcut.lnk" "c:\program Files\App1\program1.exe"
cscript createLink.vbs "C:\Documents and Settings\%USERNAME%\Start Menu\Programs\Program1 shortcut.lnk" "c:\program Files\App1\program1.exe"
这就是说我敦促你不要使用像“开始菜单”这样的硬编码路径,因为它们在本地化版本的Windows中不同。修改脚本代替使用special folders。
替代方法可以发现,使用第三方工具:
Creating a Shortcut from the command line (batch file)
XXMKLINK:
随着XXMKLINK,你可以写一个用于软件的批处理文件 已通过专门安装完成安装 程序。基本上,XXMKLINK是一种从命令行收集各种信息并将其打包成快捷方式的工具。
xxmklink spath opath
where
spath path of the shortcut (.lnk added as needed)
opath path of the object represented by the shortcut
使用VBScript:
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("AllUsersDesktop")
set oShellLink = WshShell.CreateShortcut(strDesktop & "\shortcut name.lnk")
oShellLink.TargetPath = "c:\application folder\application.exe"
oShellLink.WindowStyle = 1
oShellLink.IconLocation = "c:\application folder\application.ico"
oShellLink.Description = "Shortcut Script"
oShellLink.WorkingDirectory = "c:\application folder"
oShellLink.Save
编号:http://www.tomshardware.com/forum/52871-45-creating-desktop-shortcuts-command-line
做不到这一点,一个快速谷歌搜索结果显示,有一些第三方工具可以创建的.lnk的应用程序快捷方式文件。我假设你需要坚持自己在Windows上可用的东西? VBscript可能是您最好的选择,否则我会建议您从机器上复制.lnk文件或将它用作示例以查看快捷方式文件的正确格式。
附加说明:您使用的是link.bat仅适用于Windows 95/98:
此批处理文件是仅适用于Windows 95/98。我将尽快在NT新闻组上发布相当于 的新台币。
NT版发布在http://www.robvanderwoude.com/amb_shortcutsnt.html。如果优先于vbscript,您可以尝试使用.bat方法。
这是PowerShell真正擅长的事情,因此是避免批处理文件并使其成为PowerShell的原因。
PowerShell可以与.NET对话。例如,你可以在桌面的位置是这样的:
[Environment]::GetFolderPath("Desktop")
的PowerShell可以跟COM对象,包括WScript.Shell
,它可以创建快捷方式:
New-Object -ComObject WScript.Shell).CreateShortcut(...)
所以,你的脚本可能看起来像:
$linkPath = Join-Path ([Environment]::GetFolderPath("Desktop")) "MyShortcut.lnk"
$targetPath = Join-Path ([Environment]::GetFolderPath("ProgramFiles")) "MyCompany\MyProgram.exe"
$link = (New-Object -ComObject WScript.Shell).CreateShortcut($linkpath)
$link.TargetPath = $targetPath
$link.Save()
快捷方式有很多设置,WScript.Shell不能操纵,像“运行方式ADMINI选择器“选项。这些只能通过Win32界面IShellLinkDataList
访问,这是一个真正的痛苦使用,但它可以完成。
在XP中,我写makeshortcut.vbs
Set oWS = WScript.CreateObject("WScript.Shell")
If wscript.arguments.count < 4 then
WScript.Echo "usage: makeshortcut.vbs shortcutPath targetPath arguments workingDir "
WScript.Quit
end If
shortcutPath = wscript.arguments(0) & ".LNK"
targetPath = wscript.arguments(1)
arguments = wscript.arguments(2)
workingDir = wscript.arguments(3)
WScript.Echo "Creating shortcut " & shortcutPath & " targetPath=" & targetPath & " arguments=" & arguments & " workingDir=" & workingDir
Set oLink = oWS.CreateShortcut(shortcutPath)
oLink.TargetPath = targetPath
oLink.Arguments = arguments
' oLink.Description = "MyProgram"
' oLink.HotKey = "ALT+CTRL+F"
' oLink.IconLocation = "C:\Program Files\MyApp\MyProgram.EXE, 2"
' oLink.WindowStyle = "1"
oLink.WorkingDirectory = workingDir
oLink.Save
,也恰恰是4个ARGS,因此它可以通过将后2个optional.I改善只发布,因为它呼应的使用,这可能是一些有用的。我喜欢WS的soln使用特殊文件夹和ExpandEnvironmentStrings
这对我在Windows XP ms-dos上工作,我仍然没有在Windows 7上尝试过。它就像在Linux中创建符号链接一样。
shortcut -T source.exe destination.lnk
最后,我决定写正确的脚本,因为没有解决方案适用于我 您将需要两个fileLocal设置\ 第一
createSCUT.bat
@echo on
set VBS=createSCUT.vbs
set SRC_LNK="shortcut1.lnk"
set ARG1_APPLCT="C:\Program Files\Google\Chrome\Application\chrome.exe"
set ARG2_APPARG="--profile-directory=QuteQProfile 25QuteQ"
set ARG3_WRKDRC="C:\Program Files\Google\Chrome\Application"
set ARG4_ICOLCT="%USERPROFILE%\Local Settings\Application Data\Google\Chrome\User Data\Profile 25\Google Profile.ico"
cscript %VBS% %SRC_LNK% %ARG1_APPLCT% %ARG2_APPARG% %ARG3_WRKDRC% %ARG4_ICOLCT%
和第二个
个createSCUT.vbs
Set objWSHShell = WScript.CreateObject("WScript.Shell")
set objWSHShell = CreateObject("WScript.Shell")
set objFso = CreateObject("Scripting.FileSystemObject")
If WScript.arguments.count = 5 then
WScript.Echo "usage: makeshortcut.vbs shortcutPath targetPath arguments workingDir IconLocation"
sShortcut = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(0))
set objSC = objWSHShell.CreateShortcut(sShortcut)
sTargetPath = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(1))
sArguments = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(2))
sWorkingDirectory = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(3))
sIconLocation = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(4))
objSC.TargetPath = sTargetPath
rem http://www.bigresource.com/VB-simple-replace-function-5bAN30qRDU.html#
objSC.Arguments = Replace(sArguments, "QuteQ", Chr(34))
rem http://msdn.microsoft.com/en-us/library/f63200h0(v=vs.90).aspx http://msdn.microsoft.com/en-us/library/267k4fw5(v=vs.90).aspx
objSC.WorkingDirectory = sWorkingDirectory
objSC.Description = "Love Peace Bliss"
rem 1 restore 3 max 7 min
objSC.WindowStyle = "3"
rem objSC.Hotkey = "Ctrl+Alt+e";
objSC.IconLocation = sIconLocation
objSC.Save
WScript.Quit
end If
If WScript.arguments.count = 4 then
WScript.Echo "usage: makeshortcut.vbs shortcutPath targetPath arguments workingDir "
sShortcut = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(0))
set objSC = objWSHShell.CreateShortcut(sShortcut)
sTargetPath = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(1))
sArguments = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(2))
sWorkingDirectory = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(3))
objSC.TargetPath = sTargetPath
objSC.Arguments = Replace(sArguments, "QuteQ", Chr(34))
objSC.WorkingDirectory = sWorkingDirectory
objSC.Description = "Love Peace Bliss"
objSC.WindowStyle = "3"
objSC.Save
WScript.Quit
end If
If WScript.arguments.count = 2 then
WScript.Echo "usage: makeshortcut.vbs shortcutPath targetPath"
sShortcut = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(0))
set objSC = objWSHShell.CreateShortcut(sShortcut)
sTargetPath = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(1))
sWorkingDirectory = objFso.GetAbsolutePathName(sShortcut)
objSC.TargetPath = sTargetPath
objSC.WorkingDirectory = sWorkingDirectory
objSC.Save
WScript.Quit
end If
编辑14年6月24日 - 以下功能补充说: - 编辑快捷厚
快捷 - 设置/删除 “以管理员身份运行” 的 - 列出性质Here一个维护版本的脚本可以找到
当使用Windows脚本H OST我喜欢的JScript,因为它允许创建既不有毒的消息,也没有临时files.Here的我shortcutJS.bat的混合文件(只要你喜欢,你可以把它命名为)允许您使用的所有快捷方式的属性:
@if (@X)==(@Y) @end /* JScript comment
@echo off
cscript //E:JScript //nologo "%~f0" "%~nx0" %*
exit /b %errorlevel%
@if (@X)==(@Y) @end JScript comment */
var args=WScript.Arguments;
var scriptName=args.Item(0);
//var adminPermissions= false;
var edit= false;
function printHelp() {
WScript.Echo(scriptName + " -linkfile link -target target [-linkarguments linkarguments] "+
" [-description description] [-iconlocation iconlocation] [-hotkey hotkey] "+
" [-windowstyle 1|3|7] [-workingdirectory workingdirectory] [-adminpermissions yes|no]");
WScript.Echo();
WScript.Echo(scriptName + " -edit link [-target target] [-linkarguments linkarguments] "+
" [-description description] [-iconlocation iconlocation] [-hotkey hotkey] "+
" [-windowstyle 1|3|7] [-workingdirectory workingdirectory] [-adminpermissions yes|no]");
WScript.Echo();
WScript.Echo(scriptName + " -examine link");
WScript.Echo();
WScript.Echo(" More info: http://msdn.microsoft.com/en-us/library/xk6kst2k%28v=vs.84%29.aspx ");
}
// reads the given .lnk file as a char array
function getlnkChars(lnkPath) {
// :: http://www.dostips.com/forum/viewtopic.php?f=3&t=3855&start=15&p=28898 ::
var ado = WScript.CreateObject("ADODB.Stream");
ado.Type = 2; // adTypeText = 2
ado.CharSet = "iso-8859-1"; // code page with minimum adjustments for input
ado.Open();
ado.LoadFromFile(lnkPath);
var adjustment = "\u20AC\u0081\u201A\u0192\u201E\u2026\u2020\u2021" +
"\u02C6\u2030\u0160\u2039\u0152\u008D\u017D\u008F" +
"\u0090\u2018\u2019\u201C\u201D\u2022\u2013\u2014" +
"\u02DC\u2122\u0161\u203A\u0153\u009D\u017E\u0178" ;
var fs = new ActiveXObject("Scripting.FileSystemObject");
var size = (fs.getFile(lnkPath)).size;
var lnkBytes = ado.ReadText(size);
ado.Close();
var lnkChars=lnkBytes.split('');
for (var indx=0;indx<size;indx++) {
if (lnkChars[indx].charCodeAt(0) > 255) {
lnkChars[indx] = String.fromCharCode(128 + adjustment.indexOf(lnkChars[indx]));
}
}
return lnkChars;
}
function hasAdminPermissions(lnkPath) {
return (getlnkChars(lnkPath))[21].charCodeAt(0) == 32 ;
}
function setAdminPermissions(lnkPath , flag) {
lnkChars=getlnkChars(lnkPath);
var ado = WScript.CreateObject("ADODB.Stream");
ado.Type = 2; // adTypeText = 2
ado.CharSet = "iso-8859-1"; // right code page for output (no adjustments)
//ado.Mode=2;
ado.Open();
// setting the 22th byte to 32
if (flag) {
lnkChars[21]=String.fromCharCode(32);
} else {
lnkChars[21]=String.fromCharCode(0);
}
ado.WriteText(lnkChars.join(""));
ado.SaveToFile(lnkPath, 2);
ado.Close();
}
function examine(lnkPath) {
var fs = new ActiveXObject("Scripting.FileSystemObject");
if (!fs.FileExists(lnkPath)) {
WScript.Echo("File " + lnkPath + " does not exist");
WScript.Quit(2);
}
var oWS = new ActiveXObject("WScript.Shell");
var oLink = oWS.CreateShortcut(lnkPath);
WScript.Echo("");
WScript.Echo(lnkPath + " properties:");
WScript.Echo("");
WScript.Echo("Target: " + oLink.TargetPath);
WScript.Echo("Icon Location: " + oLink.IconLocation);
WScript.Echo("Description: " + oLink.Description);
WScript.Echo("Hotkey: " + oLink.HotKey);
WScript.Echo("Working Directory: " + oLink.WorkingDirectory);
WScript.Echo("Window style: " + oLink.WindowStyle);
WScript.Echo("Admin Permissions: " + hasAdminPermissions(lnkPath));
WScript.Quit(0);
}
if (WScript.Arguments.Length==1 || args.Item(1).toLowerCase() == "-help" || args.Item(1).toLowerCase() == "-h") {
printHelp();
WScript.Quit(0);
}
if (WScript.Arguments.Length % 2 == 0) {
WScript.Echo("Illegal arguments ");
printHelp();
WScript.Quit(1);
}
if (args.Item(1).toLowerCase() == "-examine") {
var linkfile = args.Item(2);
examine(linkfile);
}
if (args.Item(1).toLowerCase() == "-edit") {
var linkfile = args.Item(2);
edit=true;
}
if(!edit) {
for (var arg = 1;arg<5;arg=arg+2) {
if (args.Item(arg).toLowerCase() == "-linkfile") {
var linkfile = args.Item(arg+1);
}
if (args.Item(arg).toLowerCase() == "-target") {
var target = args.Item(arg+1);
}
}
}
if (typeof linkfile === 'undefined') {
WScript.Echo("Link file not defined");
printHelp();
WScript.Quit(2);
}
if (typeof target === 'undefined' && !edit) {
WScript.Echo("Target not defined");
printHelp();
WScript.Quit(3);
}
var oWS = new ActiveXObject("WScript.Shell");
var oLink = oWS.CreateShortcut(linkfile);
if(typeof target === 'undefined') {
var startIndex=3;
} else {
var startIndex=5;
oLink.TargetPath = target;
}
for (var arg = startIndex ; arg<args.Length;arg=arg+2) {
if (args.Item(arg).toLowerCase() == "-linkarguments") {
oLink.Arguments = args.Item(arg+1);
}
if (args.Item(arg).toLowerCase() == "-description") {
oLink.Description = args.Item(arg+1);
}
if (args.Item(arg).toLowerCase() == "-hotkey") {
oLink.HotKey = args.Item(arg+1);
}
if (args.Item(arg).toLowerCase() == "-iconlocation") {
oLink.IconLocation = args.Item(arg+1);
}
if (args.Item(arg).toLowerCase() == "-windowstyle") {
oLink.WindowStyle = args.Item(arg+1);
}
if (args.Item(arg).toLowerCase() == "-workdir") {
oLink.WorkingDirectory = args.Item(arg+1);
}
if (args.Item(arg).toLowerCase() == "-adminpermissions") {
if(args.Item(arg+1).toLowerCase() == "yes") {
var adminPermissions= true;
} else if(args.Item(arg+1).toLowerCase() == "no") {
var adminPermissions= false;
} else {
WScript.Echo("Illegal arguments (admin permissions)");
WScript.Quit(55);
}
}
}
oLink.Save();
if (!(typeof adminPermissions === 'undefined')) {
setAdminPermissions(linkfile ,adminPermissions);
}
请不要假定Program Files位于“C:\ Program Files”中。(%PROGRAMFILES%可以工作,但)。同样,不要假定用户的主目录位于“C:\ Documents and Settings \%USERNAME%”(它是%HOMEDIR%)。和桌面可能不称为桌面。 – 2009-02-12 17:26:43
是否有可用于在Windows 7上创建快捷方式的解决方案? – JoeYo 2013-01-03 08:05:35
@JayBazuzi它在Windows 7,8和Server 2012上是`%HomePath%`。:) – wasatchwizard 2013-10-28 18:02:02