Avatar of McKnife
McKnife
Flag for Germany asked on

Script needed that extracts link targets to a text file

Hi experts.

Preparing a win8.1->win10 migration, I noticed that Microsoft does not migrate the pinned win8.1 start menu tiles to the new start menu - what a shame. And while in win8.1 we could even use GPOs to pin certain installed applications, this feature is deprecated in win10.
I'd like to assist my users in migrating those so I have been looking for a scripted solution.

I found this so far which works: https://gallery.technet.microsoft.com/scriptcenter/Script-to-pin-items-to-51be533c
What I need for completion is a script that we can run against a directory full of link files (.lnk) and that will write the link targets to a text file which can be used by this powershell cmdlet afterwards.

I already found something but I am struggling to get it to work with links that include spaces, so I am looking for help here.
This is it: target.bat from http://www.computerhope.com/forum/index.php?topic=80659.0

I hope to be able to run target.bat somefolderFulloflinks and get a text file like
"c:\somepath\some.exe"
"c:\anotherpath with spaces\another.exe"
...
PowershellVB ScriptWindows Batch

Avatar of undefined
Last Comment
McKnife

8/22/2022 - Mon
oBdA

Since your "Pin" script is Powershell, here's a Powershell script you can use as function or stand-alone script.
It'll return a custom object that you can then pipe to Select-Object and/or Export-Csv as you need.
It accepts pipeline input, so you can just pass it the results of a Get-ChildItem. Advertiseed shortcuts are supported.
Example:
Get-ChildItem -Path "C:\ProgramData\Microsoft\Windows\Start Menu" -Recurse -Filter *.lnk | % {.\Get-Shortcut.ps1 -Path $_.FullName} | Export-Csv -Path C:\Temp\Shortcuts.csv -NoTypeInformation

Open in new window

Param(
	[Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True, Position=0)][ValidateNotNull()]
	[string[]]$Path
)
Begin {
	$Shell = New-Object -ComObject WScript.Shell
	$Installer = New-Object -ComObject WindowsInstaller.Installer
}
Process {
	$Path | ForEach-Object {
		If (Test-Path -Path $_ -PathType Leaf) {
			$Shortcut = $Shell.CreateShortcut($_) | Select-Object -Property `
				Name,
				*,
				@{Name="IsAdvertised"; Expression={$False}},
				AdvertisedTargetPath,
				@{Name="TargetExists"; Expression={$False}},
				Error
			$Shortcut.Name = [IO.Path]::GetFileName($_)
			If ([string]::IsNullOrEmpty($Shortcut.TargetPath)) {
				$Shortcut.Error = "Not a valid shortcut."
			} ElseIf ($Shortcut.TargetPath.ToUpper().StartsWith("${ENV:Systemroot}\Installer\".ToUpper())) {
				$Shortcut.IsAdvertised = $True
				Try {
					$ShortcutTarget = $Installer.GetType().InvokeMember("ShortcutTarget", "GetProperty", $Null, $Installer, $_)
					$StringData = 1, 3 | % {$ShortcutTarget.GetType().InvokeMember("StringData", "GetProperty", $Null, $ShortcutTarget, $_)}
					$Shortcut.AdvertisedTargetPath = $Installer.GetType().InvokeMember("ComponentPath", "GetProperty", $Null, $Installer, $StringData)
				} Catch {
					$Shortcut.Error = "Advertised product not installed."
				}
			}
			$Shortcut.TargetExists = ![string]::IsNullOrEmpty($Shortcut.TargetPath) -And ((Get-Item -Path $Shortcut.TargetPath -ErrorAction SilentlyContinue) -ne $Null)
			$Shortcut | Write-Output
		} Else {
			"Shortcut '$_' not found!" | Write-Error
		}
	}
}
End {
}

Open in new window

McKnife

ASKER
Hi ObdA.

That looks good.
So I modified it a little and started
Get-ChildItem -Path "$env:APPDATA\Microsoft\Windows\Start Menu\programs" -Filter *.lnk | % {D:\Documents\Get-Shortcut.ps1 -Path $_.FullName} | Export-Csv -Path C:\Temp\Shortcuts.csv -NoTypeInformation

Open in new window

so that it will look only in %appdata%\Microsoft\Windows\Start Menu\programs. It works but the output is rather large. I am not able to modify it so that it only includes targetpath. Could you help again?
ASKER CERTIFIED SOLUTION
oBdA

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
McKnife

ASKER
Wonderful, thanks. Would have taken me a some time to figure this out.
You should write an article to make it usable for others that like to migrate their start menu tiles to win10.
All of life is about relationships, and EE has made a viirtual community a real community. It lifts everyone's boat
William Peck