//  SendToQuickLaunch.js - Version 1.3
//  Copyright (c) 2010, 2013 Bill Chatfield <bill_chatfield@yahoo.com>
//  All rights reserved.

var programDesc = "Send to Quick Launch";
var quickLaunchMenuItem = "Quick Launch (create shortcut)";
var installFolder = getEnvironmentVariable("AppData") + "\\" + programDesc;
var installedScript = installFolder + "\\" + WScript.ScriptName;

var shell = null;
var environment = null;
var fileSystem = null;

/* Returns a FileSystemObject object */
function getFileSystem() {
    if (fileSystem == null) {
        fileSystem = WScript.CreateObject("Scripting.FileSystemObject");
    }
    return fileSystem;
}

/* Returns a WshShell object */
function getShell() {
    if (shell == null) {
        shell = WScript.CreateObject("WScript.Shell");
    }
    return shell;
}

/* Returns a WshEnvironment object */
function getEnvironment() {
    if (environment == null) {
        environment = getShell().Environment("Process");
    }
    return environment;
}

/* Returns a String object */
function getEnvironmentVariable(name) {
    var env = getEnvironment();
    return env(name);
}

/* String */
function askOperation() {
    // Ask the user if they want to install.
    var answer = getShell().Popup("Install \"Quick Launch\" option in the \"Send To\" menu?", 300, programDesc + " - Admin", 4 + 32);
    if (answer == 6) { // If Yes
        return 'install';
    }
    var answer = getShell().Popup("Remove \"Quick Launch\" option from the \"Send To\" menu?", 300, programDesc + " - Admin", 4 + 32);
    if (answer == 6) { // If Yes
        return 'remove';
    }
    return '';
}

/* void */
function install() {
    // Copy this script into its formal install folder.
    if (! getFileSystem().FolderExists(installFolder)) {
        getFileSystem().CreateFolder(installFolder);
    }
    // Destination folder must end in a backslash to be recognized as a folder.
    getFileSystem().CopyFile(WScript.ScriptFullName, installFolder + "\\", true);

    // Create the link in the SendTo folder that is invoked by the
    // "Quick Launch" menu item on the "Send To" menu. This also
    // creates the menu item beause Windows creates the "Send To"
    // menu from whatever is in the "SendTo" special folder.
    var sendToFolder = getShell().SpecialFolders("SendTo");
    var link = getShell().CreateShortcut(sendToFolder + "\\" + quickLaunchMenuItem + ".lnk");
    link.TargetPath = installedScript;
    link.WindowStyle = 1;
    link.IconLocation = "wscript.exe, 3"; // The yellow JavaScript icon is at index 3.
    link.Description = programDesc;
    link.WorkingDirectory = installFolder;
    link.Save();

    // Create a link in the Start Menu to allow uinstalling of this script.
    var programsFolder = getShell().SpecialFolders("Programs");
    var startMenuFolder = programsFolder + "\\" + programDesc;
    if (! getFileSystem().FolderExists(startMenuFolder)) {
        getFileSystem().CreateFolder(startMenuFolder);
    }
    var startMenuLink = getShell().CreateShortcut(startMenuFolder + "\\Uninstall " + programDesc + ".lnk");
    startMenuLink.TargetPath = installedScript;
    startMenuLink.Arguments = "--uninstall";
    startMenuLink.WindowStyle = 1;
    startMenuLink.IconLocation = "wscript.exe, 3";
    startMenuLink.Description = "Uninstall " + programDesc;
    startMenuLink.WorkingDirectory = installFolder;
    startMenuLink.Save();

    // Tell the user it was successful.
    getShell().Popup("The installation is complete.", 300, programDesc + " - Admin", 64);
}

/* void */
function uninstall() {
    // Uninstall Send To link.
    var sendToFolder = getShell().SpecialFolders("SendTo");
    var link = sendToFolder + "\\" + quickLaunchMenuItem + ".lnk";
    if (getFileSystem().FileExists(link)) {
        getFileSystem().DeleteFile(link);
    }

    // Uninstall file and folder in Program Files.
    if (getFileSystem().FileExists(installedScript)) {
        getFileSystem().DeleteFile(installedScript);
    }
    if (getFileSystem().FolderExists(installFolder)) {
        getShell().CurrentDirectory = "C:\\";  // Move away so we can delete it.
        getFileSystem().DeleteFolder(installFolder);
    }

    // Uninstall Start Menu link and folder.
    var programsFolder = getShell().SpecialFolders("Programs");
    var startMenuFolder = programsFolder + "\\" + programDesc;
    var startMenuLink = startMenuFolder + "\\Uninstall " + programDesc + ".lnk";
    if (getFileSystem().FileExists(startMenuLink)) {
        getFileSystem().DeleteFile(startMenuLink);
    }
    if (getFileSystem().FolderExists(startMenuFolder)) {
        getFileSystem().DeleteFolder(startMenuFolder);
    }

    getShell().Popup("It has been removed.", 300, programDesc + " - Admin", 64);
}

/* void */
function createQuickLaunchLinkFor(targetName) {
    var target = getFileSystem().GetFile(targetName);
    var link = getShell().CreateShortcut(buildShortcutFileName(target));
    link.TargetPath = target.Path;
    link.WindowStyle = 1;
    link.Description = "Shortcut to " + target.Path;
    link.WorkingDirectory = target.ParentFolder;
    link.Save();
    getShell().Popup("A shortcut to " + targetName + " was added to the Quick Launch menu.", 300, programDesc, 64);
}

/* String */
function buildShortcutFileName(/* File */ target) {
    var homeDir = getEnvironmentVariable("USERPROFILE");
    var quickLaunchDir = homeDir + "\\Desktop";
    var name = quickLaunchDir + "\\" + target.Name;
    var duplicateFileStartIndex = 2;
    var i = duplicateFileStartIndex;
    
    // Check for extensions that should be removed.
    if (target.Type == "Application") {
        // Remove the extension.
        name = name.replace(/\.exe$/i, "");
    }
    else if (target.Type == "MS-DOS Batch File") {
        // Remove the extension.
        name = name.replace(/\.bat$/i, "");
    }
    
    // If the target is a Shortcut already, then do not append an additional
    // link extension to the new Shortcut name. Else...
    if (target.Type != "Shortcut") {
        // The new Shortcut name does not have a ".lnk" Shortcut extension
        // because the target didn't have one, so it needs one now.
        name += ".lnk";
    }
    
    // Resolve Shortcut name conflicts.
    while (getFileSystem().FileExists(name)) {
        if (i == duplicateFileStartIndex) {
            name = name.replace(/\.lnk$/i, "(" + i + ").lnk");
        }
        else {
            name = name.replace(/\(\d+\)\.lnk$/i, "(" + i + ").lnk");
        }
        i++; // Increment index and try again.
    }
    return name;
}

/* Boolean */
function isUninstallSwitch(arg) {
    var switches = new Array("--remove", "-remove", "--uninstall", "-uninstall");
    var i;
    for (i in switches) {
        if (arg == switches[i]) {
            return true;
        }
    }
}

/////////////////////////////////////////////////////////////////////////////
//
//  Main Program
//
/////////////////////////////////////////////////////////////////////////////

var targetName;

if (WScript.Arguments.length == 0) {
    // If there is no argument, then perform an install or remove.
    var op = askOperation();
    if (op == 'install') {
        install();
    }
    else if (op == 'remove') {
        uninstall();
    }
}
else {
    // There is at least one command line argument.
    targetName = WScript.Arguments(0);

    if (isUninstallSwitch(targetName)) {
        uninstall();
    }
    else {
        // If we have an argument then we were invoked from the SendTo menu,
        // so create a Quick Launch link for the given argument.
        createQuickLaunchLinkFor(targetName);
    }
}

3

  • 欢迎来到 SuperUser。虽然我们很高兴您与我们分享了您的代码,但代码本身并不是一个问题。您是否只是在网上某处找到了此代码并想修改其行为方式?请花一点时间解释此代码的总体目的、它应该做什么、它做了什么以及您希望它做什么。另外,请注意,有一个专门讨论编程问题的姊妹网站,一个完全关于编程的问题可能更适合在那里,但前提是它包含更多/更好的信息。


    – 


  • 我知道我已编辑“将快捷方式发送到桌面”。我的目的是:1.使其与文件和文件夹一起工作。2.避免弹出窗口3.直接将其添加到主上下文菜单,而不是单击“发送到”,然后单击“桌面(创建快捷方式)”我已设法将其添加到注册表中,如下所示:[HKEY_CLASSES_ROOT*\shell\Add To Desktop\command] @=”wscript.exe \”C:\\Users\\xxxxxxxx\\AppData\\Roaming\\Add To Desktop\\Add To Desktop.js\” \”%1\”” 它与文件配合得很好,但与文件夹配合不好。我希望我已经解释清楚了。谢谢!


    – 

  • 如果你想知道,这是取自:


    – 


最佳答案
1

发布的代码包含不需要的安装和删除例程,最初是为了在 QuickLaunch 文件夹中创建快捷方式而编写的,并不处理创建文件夹的快捷方式。从该代码开始会给简单的要求增加不必要的复杂性。

Send to要复制上下文菜单根目录下的>的功能Desktop (create shortcut),您只需要一个上下文菜单注册表项AllFileSystemObjects和一个用于创建快捷方式的简单脚本。

调用,否则控制台会短暂闪烁,因此直接用这两种语言之一编写是有意义的。由于 VBScript 将在 2027 年成为未安装的按需功能,因此是更好的选择。

更改 reg 文件以匹配您保存脚本的位置。

创建桌面快捷方式JS.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Classes\AllFileSystemObjects\shell\Create shortcut on Desktop\command]
@="WScript C:\\Tools\\CreateDesktopShortcut.js \"%1\""

创建桌面快捷方式.js

if (WScript.Arguments.length == 0) WScript.Quit();
targetPath = WScript.Arguments(0);
includeExtension = true;
oWSH = WScript.CreateObject('WScript.Shell');
oFSO = WScript.CreateObject('Scripting.FileSystemObject');
baseName = oFSO.GetBaseName(targetPath);
if (includeExtension) baseName = oFSO.GetFileName(targetPath);
basePath = oWSH.SpecialFolders('Desktop') + '\\' + baseName;
shortcutPath = basePath + '.lnk';
count = 2;
while (oFSO.FileExists(shortcutPath)) {
    shortcutPath = basePath + ' (' + count + ')' + '.lnk';
    count++;
}
shortcut = oWSH.CreateShortcut(shortcutPath);
shortcut.TargetPath = targetPath;
shortcut.Save();

,并且会闪烁 PowerShell 窗口,因此这是一个较差的解决方案。

创建桌面快捷方式PS.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Classes\AllFileSystemObjects\shell\Create shortcut on Desktop\command]
@="PowerShell -NoLogo -NoProfile -Window Hidden -ExecutionPolicy Bypass -File C:\\Tools\\CreateDesktopShortcut.ps1 \"%1\""

创建桌面快捷方式.ps1

param ($targetPath)
if ($targetPath -eq $null) {Exit}
$includeExtension = $true
$oWSH = New-Object -ComObject WScript.Shell
$baseName = (Get-Item $targetPath).Basename
if ($includeExtension) {$baseName = (Get-Item $targetPath).Name}
$basePath = [Environment]::GetFolderPath('Desktop') + '\' + $baseName
$shortcutPath = $basePath + '.lnk'
$count = 2
while (Test-Path $shortcutPath) {
    $shortcutPath = "$basePath($count).lnk"
    $count++
}
$shortcut = $oWSH.CreateShortcut($shortcutPath)
$shortcut.targetPath = $targetPath
$shortcut.Save()

我留给读者一个练习,将上面的 PowerShell 代码转换为一行代码,这样就不需要外部文件了,但请注意,就像微软的Open PowerShell window here命令一样,单行代码会被带有撇号的文件夹或文件名所绊倒,例如Bob's Files。使用注册表或临时文件传递的解决方法%1是可行的,但很复杂。

4

  • 您值得获得 5 颗星。我知道要求太多了,但您能否编辑以下 .ps 脚本以使其作为 .js 运行 $WSHShell = New-Object -ComObject wscript.shell $Target = Get-Item -Path $Args[0] $LinkPath = ‘{1}\{0}.lnk’ -f $Target.Name, $WSHShell.SpecialFolders[‘Desktop’] $Shortcut = $WSHShell.CreateShortcut($LinkPath) $Shortcut.TargetPath = $Target.FullName $Shortcut.Save()


    – 

  • 如何编辑(CreateDesktopShortcut.js)以将文件扩展名附加到快捷方式?谢谢。


    – 

  • 完成。现在有一个includeExtension变量。我还清理了代码,使 JScript 和 PowerShell 示例尽可能相似。


    – 

  • 非常感谢!谢谢!


    –