我试图创建一个简单的脚本,作为部署到多个网站的一部分,将创建一个桌面快捷方式到一个网址,并应用一个图标,但我遇到了一些错误。
以下是脚本:
# region Functions
Push-Location $PSScriptRoot
# Initial values
$Icon_start_path = ".\Icon.ico"
$Icon_end_folder = "C:\Program Files\Icons"
$Icon_end_path = "C:\Program Files\Icons\Icon.ico"
$Shortcut_end_path = "C:\Users\Public\Desktop\website.url"
$Target_path = "https://website.co.uk/"
$Icon_filename = "Icon.ico"
# If previous shortcut is there, delete it
Get-ChildItem $Shortcut_end_path -ErrorAction SilentlyContinue | Remove-Item -ErrorAction SilentlyContinue
# Check if icon file has been copied to $Icon_end_folder
if (Test-Path $Icon_end_folder) {
Write-Host "Icons folder already exists."
}
else
{
#Create directory if it doesn't exists
New-item -Path $Icon_end_folder -ItemType Directory
Write-Host "Icons folder created."
}
# Copy the icon file over
Copy-Item -Path $Icon_start_path -Destination $Icon_end_folder
# Create the shortcut
$shell = New-Object -ComObject WScript.Shell
$shortcut = $Shell.CreateShortcut($Shortcut_end_path)
$shortcut.TargetPath = $Target_path
$Shortcut.IconLocation = $Icon_end_path
$shortcut.Save()
字符串
当我在PowerShell中测试运行它时,我收到以下错误消息:
The shortcut pathname must end with .lnk or .url.
At line:2 char:1
+ $shortcut = $Shell.CreateShortcut($Shortcut_end_path)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
The property 'TargetPath' cannot be found on this object. Verify that the property exists and can be set.
At line:3 char:1
+ $shortcut.TargetPath = $Target_path
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound
The property 'IconLocation' cannot be found on this object. Verify that the property exists and can be set.
At line:4 char:1
+ $Shortcut.IconLocation = "C:\Program Files\NHS_Icons\CSMS.ico"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound
You cannot call a method on a null-valued expression.
At line:5 char:1
+ $shortcut.Save()
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
型
尽管如此,它做的一切都是正确的-创建文件夹,复制.ico,在桌面上创建一个功能.url-但错误消息似乎暗示它找不到正确的网址来分配给快捷方式。之后的一切看起来都是说它不知道该怎么处理之后的命令,因为快捷方式还没有正确创建。
如果这些都可以忽略,那就好,但我最不想做的就是快捷方式中的.ico。有人能给我建议一个解决方案吗?
2条答案
按热度按时间s3fp2yjn1#
像这样的东西应该足够了。至少对我有用。️😉🤷🏼
字符串
kyks70gy2#
考虑到错误消息,您的代码不太可能工作:
$Shortcut_end_path
的值实际上并没有以.url
结尾$shortcut
-由于失败的(New-Object -ComObject WScript.Shell).CreateShortcut()
调用-包含$null
和Set-StrictMode -Version 2
或更高版本。如果你传递了一个以
.url
结尾的$Shortcut_end_path
路径,为了创建一个 URL 快捷方式,(New-Object -ComObject WScript.Shell).CreateShortcut()
返回的是一个WshUrlShortcut
示例(而创建一个 * 常规 * 快捷方式(.lnk
)返回一个WshShortcut
示例)。与
WshShortcut
不同,WshUrlShortcut
示例的唯一 * 可写属性是.TargetPath
-奇怪的是,.IconLocation
不存在。但是,与二进制的
.lnk
文件不同,**.url
文件是INI格式的 * 纯文本文件 *,因此您有两个选项:.url
文件编写为纯文本,如Olaf's helpful answer所示。.url
文件后面 * 追加 * 图标信息:**字符串
或者,如果你想要一个 * 完全 * 编程化的解决方案**,你可以使用一个普通的
.lnk
文件:.lnk
文件快捷方式也可以在其.TargetLocation
属性中接受URL,并且 do 具有.IconLocation
属性型