I work in higher ed and we need the computers in each of our 100 classrooms to have a URL shortcut on the desktop to the room camera's IP address. I am trying to automate this using a PowerShell script. I have created a script that has a table, looks up the computer name, looks it up in the table to find the associated IP address, and creates a URL shortcut on the desktop. Unfortunately, I get an error any time I try to pass the $IP variable to $urlShortcut.TargetPath. I'm hoping this is an easy fix? Thanks in advance!
Here is a genericized version of my script. If I replace $urlShortcut.TargetPath = $IP with $urlShortcut.TargetPath = "https://www.google.com", for example, it creates the shortcut to Google.
#Create table
$table = @{}
$table.Add('Room 1,'1.1.1.1')
$table.Add('Room 2','1.1.1.2')
#Determine computer name
$CPUName = $env:computername
#Determine IP address based on room
$IP = $table[$CPUName]
#Display IP Address
write-output $IP
#Create shortcut on desktop
$wshShell = New-Object -ComObject "WScript.Shell"
$urlShortcut = $wshShell.CreateShortcut(
(Join-Path $wshShell.SpecialFolders.Item("AllUsersDesktop") "Camera Control.url")
)
$urlShortcut.TargetPath = $IP
$urlShortcut.Save()
CodePudding user response:
Mathias R. Jessen has provided the crucial pointer:
- Use
"http://$IP/"instead of just$IPwhen assigning to$urlShortcut.TargetPath, given that you want to open a URL.
The command forms that shortcut files support in their .TargetPath property are those recognized by the ShellExecuteEx WinAPI function, which both PowerShell's Start-Process cmdlet and cmd.exe's internal start command wrap.
Thus, you can test commands for shortcut files using Start-Process; e.g.:
# !! WRONG
# Without a protocol specifier such as http:, the URL isn't recognized.
Start-Process example.org
# OK
Start-Process https://example.org
However, what Start-Process does not do[1] - unlike shortcut files and cmd.exe's start command - is to expand cmd.exe-style environment variable references such as %windir%.
Thus, a complete emulation of what a shortcut-file command line will do, from PowerShell, requires calling cmd.exe's internal start command via cmd /c; e.g., to test command line notepad.exe %windir%\win.ini:
cmd /c 'start "" notepad.exe %windir%\win.ini'
Note: The "" argument preceding the command line binds to start's argument for specifying a window title for the new process (which only applies to calling console applications). Binding this argument allows you to use "..."-enclosed executable paths as part of the command line to test.
[1] Owing to the behavior of the .NET API it builds on, System.Diagnostics.Process.
