1

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()
1
  • 2
    The bare string 1.1.1.1 is not a valid path, try $urlShortcut.TargetPath = "http://$IP/" instead Commented Aug 30, 2022 at 17:02

1 Answer 1

1

Mathias R. Jessen has provided the crucial pointer:

  • Use "http://$IP/" instead of just $IP when 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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.