How to remove all the tiles in the Windows 10 start menu?

A common problem I have is that I have a new PC that I'll be using for a while. And pretty much every Windows 10 PC I've used (even work PCs) have a ton of junk I don't want in the start menu in the form of a tile. I don't care much about the stuff in the "all apps" menu because it's out of the way, but I want the tiles to be just for stuff I use a lot.

Unfortunately, as far as I can tell, the only way to remove tiles is one by one by right clicking > unpin from start. How can I quickly remove all these tiles?

Also, is there some easy way to copy over the start menu links and layout from another computer? This would be useful as I have a number of programs that I always want in the start menu no matter what PC I'm using.


Solution 1:

WARNING: The script runs without confirmation and feedback. It worked for me (see PS2), but I don't know if it would work for everybody.

From this and this, I made the following script, which did the thing for me:

(New-Object -Com Shell.Application).
    NameSpace('shell:::{4234d49b-0245-4df3-b780-3893943456e1}').
    Items() |
  %{ $_.Verbs() } |
  ?{$_.Name -match 'Un.*pin from Start'} |
  %{$_.DoIt()}

It unpins all programs from start menu.


For non-english Windows, you should probably replace 'Un.*pin from Start' by another sentence.

Run

(New-Object -Com Shell.Application).
    NameSpace('shell:::{4234d49b-0245-4df3-b780-3893943456e1}').
    Items() |
  %{ $_.Verbs() }

To check what's yours. In French : '&Désépingler de la page d''accueil'

PS: previous command may print long list which is hard to look through manually. You could see actions for some known application in the start screen by the command (substitute the name to match, for me it was KeePass):

(New-Object -Com Shell.Application).
     NameSpace('shell:::{4234d49b-0245-4df3-b780-3893943456e1}').
     Items() | ?{$_.Name() -match 'Keep.*'} |
     %{ $_.Verbs() }

PS2: @MarcoLackovic reported that it does not remove all. Recently I had a chance to try it and it indeed did not remove all. What was left were references to Windows Store. Looks like the script only scans through installed applications, so it does not remove other icons. I would suspect it also skips pinned documents, for example.

Solution 2:

I've come up with a lengthy but comprehensive script for this that removes all tiles, even those for apps that haven't been installed (Candy Crush, Netflix, etc.). Copy the contents below and run from a PowerShell ISE window executed as Administrator.

It will remove all titles for the current logged user, plus it optionally do the same for all new users in the computer - see below.

#Requires -RunAsAdministrator

$START_MENU_LAYOUT = @"
<LayoutModificationTemplate xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout" xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout" Version="1" xmlns:taskbar="http://schemas.microsoft.com/Start/2014/TaskbarLayout" xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification">
    <LayoutOptions StartTileGroupCellWidth="6" />
    <DefaultLayoutOverride>
        <StartLayoutCollection>
            <defaultlayout:StartLayout GroupCellWidth="6" />
        </StartLayoutCollection>
    </DefaultLayoutOverride>
</LayoutModificationTemplate>
"@

$layoutFile="C:\Windows\StartMenuLayout.xml"

#Delete layout file if it already exists
If(Test-Path $layoutFile)
{
    Remove-Item $layoutFile
}

#Creates the blank layout file
$START_MENU_LAYOUT | Out-File $layoutFile -Encoding ASCII

$regAliases = @("HKLM", "HKCU")

#Assign the start layout and force it to apply with "LockedStartLayout" at both the machine and user level
foreach ($regAlias in $regAliases){
    $basePath = $regAlias + ":\SOFTWARE\Policies\Microsoft\Windows"
    $keyPath = $basePath + "\Explorer" 
    IF(!(Test-Path -Path $keyPath)) { 
        New-Item -Path $basePath -Name "Explorer"
    }
    Set-ItemProperty -Path $keyPath -Name "LockedStartLayout" -Value 1
    Set-ItemProperty -Path $keyPath -Name "StartLayoutFile" -Value $layoutFile
}

#Restart Explorer, open the start menu (necessary to load the new layout), and give it a few seconds to process
Stop-Process -name explorer
Start-Sleep -s 5
$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^{ESCAPE}')
Start-Sleep -s 5

#Enable the ability to pin items again by disabling "LockedStartLayout"
foreach ($regAlias in $regAliases){
    $basePath = $regAlias + ":\SOFTWARE\Policies\Microsoft\Windows"
    $keyPath = $basePath + "\Explorer" 
    Set-ItemProperty -Path $keyPath -Name "LockedStartLayout" -Value 0
}

#Restart Explorer and delete the layout file
Stop-Process -name explorer

# Uncomment the next line to make clean start menu default for all new users
#Import-StartLayout -LayoutPath $layoutFile -MountPath $env:SystemDrive\

Remove-Item $layoutFile

In addition, this script can be used in a few other ways:

  1. To apply to new users:

    a. Uncomment the said line in the script

  2. To apply a customized layout

    a. Customize your start layout exactly how you want it

    b. Export it using this MS guide: https://docs.microsoft.com/en-us/windows/configuration/customize-and-export-start-layout

    c. Replace $START_MENU_LAYOUT with your exported XML (making sure to escape characters properly)

That should take care of all cases mentioned in the original question.