Skip to content

Citrix Receiver for Windows – Remove orphaned Start Menu Shortcuts and/or Folders

Did you ever wonder how to get rid of those orphaned Citrix Start Menu Shortcuts and/or folders?

Well, wonder no more! Here is the script (Remove-CitrixShortcuts.ps1) to remove any Citrix-related shortcut (lnk file extension) from selected Paths.

Simply adjust the Paths variable to your requiremets.

#############################################################################
# Script: Remove-CitrixShortcutsps1
# Author: Alexander Ollischer     
# Blog: https://blog.ollischer.com
# Date: 12/14/2015
# Keywords: Citrix Shortcuts, Orphaned Shortcuts, Folders, Empty, Directories, Containers
#############################################################################
# DISCLAIMER
#############################################################################
# THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND. THE ENTIRE
# RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER.
#############################################################################
 
Clear-Host
$Paths = "$env:APPDATA\Microsoft\Windows\Start Menu\","$home\Desktop\","$env:APPDATA\Microsoft\Internet Explorer\Quick Launch\User Pinned\StartMenu"
#Add some logging...
$LogTime = Get-Date -Format "mm-dd-yyyy_hh-mm-ss"
$LogFile = "$home\Remove-CitrixShortcuts_"+$LogTime+".log"

$wshShell = New-Object -ComObject WScript.Shell
ForEach($Path in $Paths) {
$Files = Get-ChildItem $Path -Recurse -Include *.lnk
foreach ($file in $Files) {
  $shortcut = $wshShell.CreateShortcut($file.FullName)
  if ($shortcut.TargetPath -like "*Citrix*") {
    $shortcut.TargetPath | Out-File $LogFile -Append
    $file.FullName | Out-File $LogFile -Append
    Remove-Item $file
    #Remove-Item $file -WhatIf
  }
  }
}

After that there maybe some empty folders left that need removing, too. Use this script (Remove-EmptyFolders.ps1) after removing the shortcuts in order to remove them as well (courtesy of Chris Brown, who pointed me in the right direction):

$Paths = "$env:APPDATA\Microsoft\Windows\Start Menu\","$home\Desktop\"
#Add some logging...
$LogTime = Get-Date -Format "mm-dd-yyyy_hh-mm-ss"
$LogFile = "$home\Remove-EmptyFolders_"+$LogTime+".log"

# Get each item under the current directory recursively
# enhanced filter by Empty Folders and Verify through File Count
foreach($childItem in (Get-ChildItem $Paths -Recurse | Where-Object {$_.PSIsContainer -eq $True} | Where-Object {$_.GetFiles().Count -eq 0}))
{
    # if it's a folder AND does not have child items of its own
    if( ($childItem.PSIsContainer) -and (!(Get-ChildItem -Recurse -Path $childItem.FullName)))
    {
        # Delete it
        $childItem.FullName | Out-File $LogFile -Append
        Remove-Item $childItem.FullName -Confirm:$false
    }
}

Both scripts can be downloaded here:

Leave a Reply