Public/Set-SpecShortcut.ps1

Function Set-SpecShortcut {
    <#
    .SYNOPSIS
    Updates an existing shortcut with new settings.
 
    .DESCRIPTION
    The Set-SpecShortcut function is used to update an existing shortcut with new settings. This function can update shortcuts on the desktop, start menu, or both.
 
    .PARAMETER ShortcutName
    Specifies the name of the shortcut that needs to be updated.
 
    .PARAMETER TargetPath
    Specifies the path of the item that the shortcut opens.
 
    .PARAMETER UpdateLocation
    Specifies the location where the shortcut should be updated. Valid values are 'Desktop', 'StartMenu', or 'Both'. The default value is 'Desktop'.
 
    .PARAMETER WorkingDirectory
    Specifies the working directory for the target item.
 
    .PARAMETER IconLocation
    Specifies the location of the icon for the shortcut.
 
    .PARAMETER WindowsStyle
    Specifies the window style for the shortcut. Valid values are 3, 7, or 4. The default value is 7.
 
    .PARAMETER Arguments
    Specifies the arguments to use when opening the target item.
 
    .PARAMETER UseLoggedInUsersDesktop
    Switch parameter. If specified, the shortcut will be updated on the logged-in user's desktop. Otherwise, it will be updated on the public desktop.
 
    .PARAMETER UseLoggedInUsersStartMenu
    Switch parameter. If specified, the shortcut will be updated in the logged-in user's start menu. Otherwise, it will be updated in all users' start menu.
 
    .EXAMPLE
    Set-SpecShortcut -ShortcutName "MyShortcut" -TargetPath "C:\MyApp.exe" -UpdateLocation 'Both' -WorkingDirectory "C:\MyApp" -IconLocation "C:\MyApp\icon.ico" -WindowsStyle 3 -Arguments "-option1 -option2"
 
    Updates the shortcut named "MyShortcut" with the specified settings. The shortcut will be updated on both the desktop and start menu. The target path is set to "C:\MyApp.exe", the working directory is set to "C:\MyApp", the icon location is set to "C:\MyApp\icon.ico", the window style is set to 3, and the arguments are set to "-option1 -option2".
 
    .NOTES
    Author: owen.heaume
    Date: 23-May-2023
    Version: 1.0
    #>
    
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, HelpMessage = "Specifies the name of the shortcut.")]
        [string]$ShortcutName,

        [Parameter(Mandatory = $true, HelpMessage = "Specifies the path of the item that the shortcut opens.")]
        [string]$TargetPath,

        [Parameter(Mandatory = $false, HelpMessage = "Specifies the location that the shortcut is created on.")]
        [ValidateSet('Desktop', 'StartMenu', 'Both')]
        [string]$UpdateLocation = 'Desktop',

        [Parameter(Mandatory = $false, HelpMessage = "Specifies the working directory for the target.")]
        [string]$WorkingDirectory = "",

        [Parameter(Mandatory = $false, HelpMessage = "Specifies the location of the icon for the shortcut.")]
        [string]$IconLocation = 'imageres.dll,4',

        [Parameter(Mandatory = $false, HelpMessage = "Specifies the window style for the shortcut.")]
        [ValidateSet(3, 7, 4)]
        [int]$WindowsStyle = 7,

        [Parameter(Mandatory = $false, HelpMessage = "Specifies the arguments to use when opening the target.")]
        [string]$Arguments,

        [Switch]$UseLoggedInUsersDesktop,

        [Switch]$UseLoggedInUsersStartMenu
    )

    # Construct paths to the desktop and start menu folders
    if ($UseLoggedInUsersDesktop) {
        $desktopPath = [Environment]::GetFolderPath("Desktop") # Logged-in user's desktop
    } else {
        $desktopPath = [Environment]::GetFolderPath("CommonDesktopDirectory") # Public desktop
    }

    if ($UseLoggedInUsersStartMenu) {
        $StartMenuPath = "$env:APPDATA\Microsoft\Windows\Start Menu" # Logged-in user's start menu
    } else {
        $StartMenuPath = [Environment]::GetFolderPath("CommonPrograms") # All users' start menu
    }

    $wshell = New-Object -ComObject WScript.Shell

    $shortcutPath = Join-Path $desktopPath "$ShortcutName.lnk"
    $startmenuPath = Join-Path $StartMenuPath "$ShortcutName.lnk"

    # Update shortcut on desktop
    if (($UpdateLocation -eq 'Desktop' -or $UpdateLocation -eq 'Both') -and (Test-Path $shortcutPath)) {
        try {
            $shortcut = $wshell.CreateShortcut($shortcutPath)
            if ($TargetPath) { $shortcut.TargetPath = $TargetPath }
            if ($PSBoundParameters.ContainsKey('WorkingDirectory')) {
                $workingDirectory = $PSBoundParameters['WorkingDirectory']
                if ($workingDirectory -ne $null) {
                    $shortcut.WorkingDirectory = $workingDirectory  # Assign new working directory
                }
            }

            if ($IconLocation -eq "") { 
                $shortcut.IconLocation = 'imageres.dll,4' # set default icon
            } elseif ($IconLocation) {
                $shortcut.iconLocation = $IconLocation
            }
            if ($WindowsStyle) { $shortcut.WindowStyle = $WindowsStyle }
            if ($PSBoundParameters.ContainsKey('Arguments')) {
                $arguments = $PSBoundParameters['Arguments']
                if ($arguments -ne $null) {
                    $shortcut.Arguments = $arguments  # Assign new argument
                }
            }        
            $shortcut.Save()
            Write-Verbose "Shortcut '$ShortcutName' on the desktop updated."
        } catch {
            Write-Error "An error occurred: $($_.Exception.Message)"
        }
    } elseif (($UpdateLocation -eq 'Desktop' -or $UpdateLocation -eq 'Both') -and (!(Test-Path $shortcutPath))) {
        Write-Warning "Unable to modify desktop shortcut: $($shortcut) as it does not exist."
    }
    
    # Update shortcut on start menu
    if (($UpdateLocation -eq 'StartMenu' -or $UpdateLocation -eq 'Both') -and (Test-Path $startmenuPath)) {
        try {
            $shortcut = $wshell.CreateShortcut($startmenuPath)
            if ($TargetPath) { $shortcut.TargetPath = $TargetPath }
            if ($PSBoundParameters.ContainsKey('WorkingDirectory')) {
                $workingDirectory = $PSBoundParameters['WorkingDirectory']
                if ($workingDirectory -ne $null) {
                    $shortcut.WorkingDirectory = $workingDirectory  # Assign new working directory
                }
            }

            if ($IconLocation -eq "") { 
                $shortcut.IconLocation = 'imageres.dll,4' # set default icon
            } elseif ($IconLocation) {
                $shortcut.iconLocation = $IconLocation
            }
            if ($WindowsStyle) { $shortcut.WindowStyle = $WindowsStyle }
            if ($PSBoundParameters.ContainsKey('Arguments')) {
                $arguments = $PSBoundParameters['Arguments']
                if ($arguments -ne $null) {
                    $shortcut.Arguments = $arguments  # Assign new argument
                }
            }
            $shortcut.Save()
            Write-Verbose "Shortcut '$ShortcutName' in the start menu updated."
        } catch {
            Write-Error "An error occurred: $($_.Exception.Message)"
        }
    } elseif (($UpdateLocation -eq 'StartMenu' -or $UpdateLocation -eq 'Both') -and (!(Test-Path $startmenuPath))) {
        Write-Warning "Unable to modify start menu shortcut: $shortcut as it does not exist."
    }
}