[Script] Create Shortcut Utility - XYplorer Beta Club

PHOTO EMBED

Sat Feb 26 2022 06:21:20 GMT+0000 (Coordinated Universal Time)

Saved by @pirate

/*#############################################################################\
Shortcuts.xys

Library for creating shortcut files.

[ABOUT]
Author    = TheQwerty
Version   = 1.0
Date      = 2014-11-11 22:00z
Requires  = XYplorer v14.50.0000

[]
\#############################################################################*/


/*******************************************************************************
** Prompt User to Create Shortcut
**   Small wizard to create a shortcut.
*******************************************************************************/
"&Prompt User to Create Shortcut : createShortcutWizard"
	Global $G_PROMPT_USER = true;
	Sub '_create';
/*************************************************** END createShortcutWizard */


/*******************************************************************************
** Create Shortcut to run script in XY
**   Creates a shortcut to run a script when starting XYplorer.
*******************************************************************************/
"Create Shortcut to &Run Script in XY : createRunXYScriptShortcut"
	$scriptFile = InputFile(<xyscripts>, 'xys', 'Select script file to run');
	End $scriptFile == '', 'No script file selected';
	End 1 != Exists($scriptFile), 'Selected item is not a file.';

	$scriptName = GetPathComponent($scriptFile, 'base');
	$scriptPath = ResolvePath($scriptFile, <xyscripts>, 1);

	$folder = InputFolder(<curpath>, 'Select folder to save shortcut');
	if ($folder == '') {
		$folder = "%desktopreal%";
	}
	End 2 != Exists($folder), 'Selected item is not a folder.';

	Global $G_SHORTCUT = Trim($folder, '\/', 'R') . '\Run ' . $scriptName . 'in XYplorer.lnk';
	Global $G_TARGET = <xy>;
	Global $G_ARGS = "/script=""$scriptPath""";
	Global $G_DESCRIPTION = "Shortcut to run $scriptName in XYplorer.";
	Unset $scriptFile, $scriptName, $scriptPath, $folder;

	Sub '_create';

	Global $G_ERR;
	if ($G_ERR == '') {
		Msg "Successfully created shortcut!<crlf 2>$G_SHORTCUT";
	} else {
		Text "Could not create shortcut.<crlf 2>$G_ERR";
	}
/********************************************** END createRunXYScriptShortcut */


/*******************************************************************************
** Delete Temporary VBScripts
**   Deletes any left over script files.
*******************************************************************************/
"&Delete Temporary VBScripts : deleteTempScripts"
	$vbScript = 'XYplorer-Create-Shortcut*.vbs';
	Delete 1, 1, "%temp%\$vbScript|%tmp%\$vbScript|<xyscripts>\$vbScript";
	Unset $vbScript;
/****************************************************** END deleteTempScripts */


"-" //--------------------------------------------------------------------------


/*******************************************************************************
** Create Shortcut to XY Example
**   Show usage example.
*******************************************************************************/
"&Create Shortcut to XY Example : createExample"
	$myPath = Self('file');
	if ($myPath != '') {
		$myPath = ResolvePath($myPath, <xyscripts>, 1);
	} else {
		$myPath = 'Shortcut';
	}

	$fakeDesktop = '%desktopreal%';
	$fakeXY = '<xy>';

	Text <<<EXAMPLE
The following example demonstrates how to use the Create Shortcut script to
create a shortcut to XYplorer on the user's desktop.
--------------------------------------------------------------------------------
"Create Shortcut to XY on Desktop Example"
	// CALL TO CREATE:
	// Input: Path to shortcut to create.
	Global $G_SHORTCUT = "$fakeDesktop\Awesome File Manager.lnk";

	// Input: Path to shortcut's target.
	Global $G_TARGET = "$fakeXY";

	// Make sure to adjust the path to Shortcut if needed.
	Load '$myPath', '_create', 'f';

	// Return: Empty string if successful, otherwise error message.
	Global $G_ERR;
	if ($G_ERR == '') {
		goto $G_SHORTCUT;
	} else {
		echo "$G_ERR";
	}
EXAMPLE
	, /*width*/, /*height*/, 'Example usage of Create Shortcut';
/********************************************************** END createExample */


"- : _-" //---------------------------------------------------------------------
"- : _-" //---------------------------------------------------------------------


/*******************************************************************************
** Create Shortcut
**   Creates a shortcut to a target item.
**
**   This script creates and executes a VBScript via CScript.exe to generate a
**   shortcut file.
**
** Parameters ------------------------------------------------------------------
** - REQUIRED INPUTS: ----------------------------------------------------------
**     G_SHORTCUT
**         The file path and name of the shortcut to create.
**         This must end with extension '.lnk' or '.url' - if it does not this
**         script will automatically append '.lnk'.
**     G_TARGET
**         The path to the shortcut's target.
**
** - OPTIONAL INPUTS: ----------------------------------------------------------
**     G_FAIL_SILENTLY
**         Set to true to skip showing error dialogs.
**         Defaults to false.
**     G_PROMPT_USER
**         Set to true to prompt the user for empty/not specified variable values.
**         Defaults to false.
**     G_OVERWRITE_SHORTCUT
**         Set to true to automatically overwrite the shortcut if it exists.
**         Defaults to false.
**     G_WORKING_DIR
**         The directory where target should be started.
**         This must be a directory.
**         If omitted target's parent is used.
**     G_ARGS
**         Arguments to pass to target.
**     G_DESCRIPTION
**         Description / Comments.
**     G_HOTKEYS
**         Hotkey used to run shortcut.
**     G_ICON
**         Shortcut's icon.
**         Format: "file[, index]" (e.g. "xyplorer.exe, 0")
**     G_WINDOW_STYLE
**         1 = Normal Window
**         3 = Maximized
**         7 = Minimized
**         if omitted '1' is used.
**     G_TIMEOUT
**         Maximum time in seconds to wait for script to run.
**         This is used when running the VBScript.
**         If omitted '60' is used.
**
** - OUTPUTS: ------------------------------------------------------------------
**     G_ERR
**         If there is any error this variable will be set to a string message.
**         Otherwise it will be empty ''.
** -----------------------------------------------------------------------------
**
** See Also:
**  "CreateShortcut Method"
**    http://msdn.microsoft.com/en-us/library/xsy6k3ys(v=vs.84).aspx
**  "WshShortcut Object Properties and Methods"
**    http://msdn.microsoft.com/en-us/library/f5y78918(v=vs.84).aspx
*******************************************************************************/
"Create Shortcut||4 : _create"
	// ERROR MESSAGES
	Global $G_ERR = '';

	// FAIL SILENTLY
	Global $G_FAIL_SILENTLY;
	$beQuiet = $G_FAIL_SILENTLY == '' ? false : $G_FAIL_SILENTLY;

	// PROMPT USER
	Global $G_PROMPT_USER;
	$promptUser = $G_PROMPT_USER == '' ? false : $G_PROMPT_USER;

	// OVERWRITE EXISTING SHORTCUTS
	Global $G_OVERWRITE_SHORTCUT;
	$overwrite = $G_OVERWRITE_SHORTCUT == '' ? false : $G_OVERWRITE_SHORTCUT;

	// PATH TO NEW SHORTCUT FILE
	Global $G_SHORTCUT;
	$shortcutPath = $G_SHORTCUT;

	if ($shortcutPath == '') {
		if ($promptUser) {
			// Prompt user if not specified.
			// Ask for folder and file name separately because InputFile would force
			// the file to exist, which makes it difficult to preventing overwriting.
			$shortcutPath = InputFolder("<curpath>", 'Where to Create Shortcut');

			$shortcutFile = Input('Create Shortcut', 'Name of shortcut file.', 'Shortcut.lnk', 's', '');
			if ($shortcutFile == '') {
				$G_ERR = "Error: User did not enter shortcut file name.";
				End true, $beQuiet ? '' : $G_ERR, true;
			}

			$shortcutPath = $shortcutPath . '\' . $shortcutFile;
			Unset $shortcutFile;
		} else {
			$G_ERR = 'Error: Shortcut path not specified';
			End true, $beQuiet ? '' : $G_ERR, true;
		}
	}

	// The shortcut path must end in lnk or url.
	if ($shortcutPath UnLikeI '*.lnk' && $shortcutPath UnLikeI '*.url') {
		$shortcutPath = $shortcutPath . '.lnk';
	}

	// Treat collisions as an error.
	if (! $overwrite) {
		if (Exists($shortcutPath) != 0) {
			$G_ERR = "Error: Shortcut already exists at '$shortcutPath'.";
			End true, $beQuiet ? '' : $G_ERR, true;
		}
	}
	Unset $overwrite;



	// PATH TO TARGET - without arguments.
	Global $G_TARGET;
	$target = $G_TARGET;
	if ($target == '') {
		if ($promptUser) {
			// Prompt user if not specified.
			// We're only going to prompt for files.
			$target = InputFile("<curpath>",, 'Shortcut Target');
		} else {
			$G_ERR = 'Error: Target path not specified';
			End true, $beQuiet ? '' : $G_ERR, true;
		}
	}

	// Ensure target exists.
	if (Exists($target) == 0) {
		$G_ERR = "Error: Target path '$target' does not exist.";
		End true, $beQuiet ? '' : $G_ERR, true;
	}

	// WORKING DIRECTORY
	Global $G_WORKING_DIR;
	$workingDir = $G_WORKING_DIR;

	if ($workingDir == '') {
		// Default to target's parent.
		$workingDir = GetPathComponent($target, 'path');
		if ($workingDir LikeI '?:') {
			// Add trailing '\' for drives.
			$workingDir = $workingDir . '\';
		}

		if ($promptUser) {
			// Prompt user if not specified.
			$workingDir = InputFolder($workingDir, 'Working Directory');
		}
	}

	// Ensure working directory exists.
	if (Exists($workingDir) != 2) {
		$G_ERR = "Error: Working directory '$workingDir' is not a folder.";
		End true, $beQuiet ? '' : $G_ERR, true;
	}

	// ARGUMENTS
	Global $G_ARGS;
	$args = $G_ARGS;

	if ($args == '' && $promptUser) {
		// Prompt user if not specified.
		$args = Input('Target Arguments', 'Arguments with which to start target.', '', 's', '');
	}

	// DESCRIPTION
	Global $G_DESCRIPTION;
	$description = $G_DESCRIPTION;

	if ($description == '' && $promptUser) {
		// Prompt user if not specified.
		$description = Input('Description', 'Comments for this shortcut.', '', 's', '');
	}

	// KEYBOARD SHORTCUT
	Global $G_HOTKEY;
	// ALT+, CTRL+, SHIFT+, EXT+
	// Keyname: a-z, 0-9, F1-F12
	// Ctrl+Alt+e
	$hotkey = $G_HOTKEY;

	if ($hotkey == '' && $promptUser) {
		// Prompt user if not specified.
		$hotkey = Input('Keyboard Shortcut', "Shortcut to start shortcut.<crlf>Can only use modifiers ALT+, CTRL+, or SHIFT+ and keys 0-9, a-f, and F1-F12.<crlf>e.g. CTRL+ALT+e", '', 's', '');
	}

	// ICON
	// Format: file[, idx]
	Global $G_ICON;
	$icon = $G_ICON;

	if ($icon == '') {
		if ($promptUser) {
			// Prompt user if not specified.
			$icon = InputFile($workingDir, 'ico;icl;exe;dll', 'Icon');
			// No prompting for index since it would just be asking for a number.
		} else {
			$icon = $target;
		}
	}


	// WINDOW STYLE
	// 1 = Normal Window
	// 2 = Maximized
	// 7 = Minimized
	Global $G_WINDOW_STYLE;
	$window = $G_WINDOW_STYLE;

	if ($window == '' && $promptUser) {
		// Prompt user if not specified.
		$window = InputSelect('Window Style', 'Normal|Maximized|Minimized', '|', 32+128, '');
		// Remap 2 > 3 and 3 > 7.
		$window = ReplaceList($window, '2|3', '3|7', '|');
	}

	// Default to 1.
	if ($window UnLikeI '[137]') {
		$window = '1';
	}

	// TIMEOUT
	Global $G_TIMEOUT;
	$timeout = $G_TIMEOUT == '' ? 60 : $G_TIMEOUT;

	Unset $promptUser;

	// Escape quotes for VBS.
	$searchList = '"';
	$replaceList = '""';
	$sep = '|';
	$matchCase = 1;

	$shortcutPath = ReplaceList($shortcutPath, $searchList, $replaceList, $sep, $matchCase);
	$target       = ReplaceList($target      , $searchList, $replaceList, $sep, $matchCase);
	$args         = ReplaceList($args        , $searchList, $replaceList, $sep, $matchCase);
	$description  = ReplaceList($description , $searchList, $replaceList, $sep, $matchCase);
	$hotkey       = ReplaceList($hotkey      , $searchList, $replaceList, $sep, $matchCase);
	$icon         = ReplaceList($icon        , $searchList, $replaceList, $sep, $matchCase);
	$window       = ReplaceList($window      , $searchList, $replaceList, $sep, $matchCase);
	$workingDir   = ReplaceList($workingDir  , $searchList, $replaceList, $sep, $matchCase);
	Unset $searchList, $replaceList, $sep, $matchCase;

	// Create contents of the vbscript to run.
	$vbScriptContents = <<<VBSCRIPT
set WshShell = WScript.CreateObject("WScript.Shell")
set oShellLink = WshShell.CreateShortcut("$shortcutPath")
oShellLink.TargetPath = "$target"
oShellLink.Arguments = "$args"
oShellLink.Description = "$description"
oShellLink.Hotkey = "$hotkey"
oShellLink.IconLocation = "$icon"
oShellLink.WindowStyle = $window
oShellLink.WorkingDirectory = "$workingDir"
oShellLink.Save
Set oShellLink = Nothing
VBSCRIPT;
		Unset $shortcutPath, $target, $workingDir, $args, $description, $hotkey, $icon, $window;

	// Try to write this vbscript to a temp folder.
	if (Exists("%temp%") == 2) {
		$vbScript = "%temp%";
	} elseif (Exists("%tmp%") == 2) {
		$vbScript = "%tmp%";
	} else {
		$vbScript = "<xyscripts>";
	}
	$vbScript = Trim($vbScript, '\/', 'R') . '\XYplorer-Create-Shortcut.vbs';

	// Write out the vbscript file - rename with suffix if needed.
	$res = WriteFile($vbScript, $vbScriptContents, 'r', 't');
	// Check if written file was renamed and use that instead.
	if ($res LikeI '4*') {
		$vbScript = GetToken($res, 2, '|');
	}
	Unset $vbScriptContents;

	// Run the vbscript file.
	$res = RunRet(<<<COMMAND
"cscript.exe" "$vbScript" //nologo //t:$timeout
COMMAND
	);

	// Clean up after ourselves.
	Delete 1, 0, $vbScript;
	Unset $vbScript, $timeout;

	// Check for any errors from vbscript.
	if ($res != '') {
		$G_ERR = 'Error running script.' . <crlf 2> . $res;
		End true, $beQuiet ? '' : $G_ERR, true;
	}
	Unset $beQuiet, $res;
/**************************************************************** END _create */
content_copyCOPY

needs to be updated

https://www.xyplorer.com/xyfc/viewtopic.php?t