Issues with Target Path in powershell in creating a short cut - powershell

I am trying to create a short cut on public desktop for users, but this target path for this short cut is causing some issues.
$wshshell = New-Object -ComObject WScript.shell
$desktop = [System.Environment]::GetFolderPath("desktop")
$lnk = $wshshell.CreateShortcut("$desktop\CLMCPDEDEV.lnk")
$lnk.TargetPath = "C:\Program Files (x86)\Unisys\WebEnabler\Web Enabler.exe" "configfile=c:\development-installs\web-enabler-config\CLMCPDEDEV.cfg"
I have the config file in another folder and exe is in a different path. I'm new to power shell, how do I bypass that space between "C:\Program Files (x86)\Unisys\WebEnabler\Web Enabler.exe" and "configfile=c:\development-installs\web-enabler-config\CLMCPDEDEV.cfg"? That's the full short cut path when I do this manually. Any guidance is much appreciated.

Quote from CreateShortcut method documentation:
A common problem is putting arguments in the TargetPath property of
the shortcut object, which doesn't work. All arguments to the shortcut
must be put in the Arguments property.
So you have to do this:
$wshshell = New-Object -ComObject WScript.shell
$desktop = [System.Environment]::GetFolderPath('Desktop')
$lnk = $wshshell.CreateShortcut((Join-Path -Path $desktop -ChildPath 'CLMCPDEDEV.lnk'))
$lnk.TargetPath = 'C:\Program Files (x86)\Unisys\WebEnabler\Web Enabler.exe'
$lnk.Arguments = 'configfile=c:\development-installs\web-enabler-config\CLMCPDEDEV.cfg'
$lnk.Save()

Related

How to move the location of an argument in a shortcut file path

I've written this script to create a shortcut, its a shortcut to a ps1 file that I want to run as a script. This requires the parameter "powershell.exe -file" Infront of the target file path like this:
powershell.exe -file c:\users\name\documents\powershellscript.ps1
My script looks like this
foreach($filename in $reqshortcutlist){
$shortcutpath = Join-Path "C:\Users\yo\Documents\Powershell Lab\source" $fileName
$pslaunch = 'powershell.exe -file'
$sclocation = "C:\Users\yo\Documents\Powershell Lab\fixes\$filename.lnk"
$WScriptObj = New-Object -ComObject ("WScript.Shell")
$shortcut = $WscriptObj.CreateShortcut($sclocation)
$shortcut.Arguments = $pslaunch
$shortcut.TargetPath = $shortcutpath
$shortcut.Save()
}
My issue is that the file path this creates looks like this:
"C:\Users\yo\Documents\Powershell Lab\Source\PS CMD Workaround.ps1" powershell.exe -file
As you can see the 'powershell.exe -file' argument is AFTER the file path, is there any way around this?
I've tried to swap the $shortcut.target path and $shortcut.arguments value with eachother so they appear the other way around but this didn't work.
I've also tried using the full powershell path instead of just powershell.exe with no luck.

Create a Powershell shortcut with start in path

Sorry if this has been asked before but I can't find a relevant answer
I want to create a shortcut on a users desktop and fill in the Start In value on in.
I can create the Icon but how do I make powershell fill in the Start in value
$TargetFile = "C:\Program Files (x86)\Program"
$ShortcutFile = "$env:Public\Desktop\Shorcut.lnk"
$WScriptShell = New-Object -ComObject WScript.Shell
$Shortcut = $WScriptShell.CreateShortcut($ShortcutFile)
$Shortcut.TargetPath = $TargetFile
$Shortcut.Save()
You can fill in the "Start in" value by simply adding this line:
$Shortcut.WorkingDirectory = "Path"

Create a lnk in PowerShell/batch [duplicate]

I am trying to create a short cut on public desktop for users, but this target path for this short cut is causing some issues.
$wshshell = New-Object -ComObject WScript.shell
$desktop = [System.Environment]::GetFolderPath("desktop")
$lnk = $wshshell.CreateShortcut("$desktop\CLMCPDEDEV.lnk")
$lnk.TargetPath = "C:\Program Files (x86)\Unisys\WebEnabler\Web Enabler.exe" "configfile=c:\development-installs\web-enabler-config\CLMCPDEDEV.cfg"
I have the config file in another folder and exe is in a different path. I'm new to power shell, how do I bypass that space between "C:\Program Files (x86)\Unisys\WebEnabler\Web Enabler.exe" and "configfile=c:\development-installs\web-enabler-config\CLMCPDEDEV.cfg"? That's the full short cut path when I do this manually. Any guidance is much appreciated.
Quote from CreateShortcut method documentation:
A common problem is putting arguments in the TargetPath property of
the shortcut object, which doesn't work. All arguments to the shortcut
must be put in the Arguments property.
So you have to do this:
$wshshell = New-Object -ComObject WScript.shell
$desktop = [System.Environment]::GetFolderPath('Desktop')
$lnk = $wshshell.CreateShortcut((Join-Path -Path $desktop -ChildPath 'CLMCPDEDEV.lnk'))
$lnk.TargetPath = 'C:\Program Files (x86)\Unisys\WebEnabler\Web Enabler.exe'
$lnk.Arguments = 'configfile=c:\development-installs\web-enabler-config\CLMCPDEDEV.cfg'
$lnk.Save()

Powershell Naming shortcut

$wshshell = New-Object -ComObject WScript.Shell
$desktop = [System.Environment]::GetFolderPath('Desktop')
$lnk = $wshshell.CreateShortcut($sourceDir+"\ShortcutName.lnk")
$lnk.TargetPath = "$destination"
$lnk.Save()
I have a script in PowerShell that at the very end creates a shortcut in the $sourceDir directory which is currently being named "ShortcutName.lnk". I need to pass a variable which will be used as the name I've tried creating one called $test which is equal to the $item.FullName although I can't seem to append that to the CreateShortcut param $sourceDir+"\ShortcutName.lnk".
$lnk = $wshshell.CreateShortcut((Join-Path $sourceDir "ShortcutName.lnk"))
Should work. Join-Path will take care of adding slashes as needed.
If you want to use your existing file object:
$lnk = $wshshell.CreateShortcut((Join-Path $sourceDir ([io.path]::ChangeExtension($item.name, "lnk"))))

How to create a shortcut using PowerShell

I want to create a shortcut with PowerShell for this executable:
C:\Program Files (x86)\ColorPix\ColorPix.exe
How can this be done?
I don't know any native cmdlet in powershell but you can use com object instead:
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$Home\Desktop\ColorPix.lnk")
$Shortcut.TargetPath = "C:\Program Files (x86)\ColorPix\ColorPix.exe"
$Shortcut.Save()
you can create a powershell script save as set-shortcut.ps1 in your $pwd
param ( [string]$SourceExe, [string]$DestinationPath )
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($DestinationPath)
$Shortcut.TargetPath = $SourceExe
$Shortcut.Save()
and call it like this
Set-ShortCut "C:\Program Files (x86)\ColorPix\ColorPix.exe" "$Home\Desktop\ColorPix.lnk"
If you want to pass arguments to the target exe, it can be done by:
#Set the additional parameters for the shortcut
$Shortcut.Arguments = "/argument=value"
before $Shortcut.Save().
For convenience, here is a modified version of set-shortcut.ps1. It accepts arguments as its second parameter.
param ( [string]$SourceExe, [string]$ArgumentsToSourceExe, [string]$DestinationPath )
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($DestinationPath)
$Shortcut.TargetPath = $SourceExe
$Shortcut.Arguments = $ArgumentsToSourceExe
$Shortcut.Save()
Beginning PowerShell 5.0 New-Item, Remove-Item, and Get-ChildItem have been enhanced to support creating and managing symbolic links. The ItemType parameter for New-Item accepts a new value, SymbolicLink. Now you can create symbolic links in a single line by running the New-Item cmdlet.
New-Item -ItemType SymbolicLink -Path "C:\temp" -Name "calc.lnk" -Value "c:\windows\system32\calc.exe"
Be Carefull a SymbolicLink is different from a Shortcut, shortcuts are just a file. They have a size (A small one, that just references where they point) and they require an application to support that filetype in order to be used. A symbolic link is filesystem level, and everything sees it as the original file. An application needs no special support to use a symbolic link.
Anyway if you want to create a Run As Administrator shortcut using Powershell you can use
$file="c:\temp\calc.lnk"
$bytes = [System.IO.File]::ReadAllBytes($file)
$bytes[0x15] = $bytes[0x15] -bor 0x20 #set byte 21 (0x15) bit 6 (0x20) ON (Use –bor to set RunAsAdministrator option and –bxor to unset)
[System.IO.File]::WriteAllBytes($file, $bytes)
If anybody want to change something else in a .LNK file you can refer to official Microsoft documentation.