Tạo phím tắt bằng Windows Script Host

  • WSH và PowerShell cho phép bạn tạo các phím tắt .lnk và .url với các biểu tượng, đối số và thư mục làm việc.
  • SpecialFolders và Shell API giải quyết các đường dẫn Desktop, Start và các đường dẫn hệ thống đặc biệt khác.
  • PowerShell truy cập COM (.WScript.Shell) và .NET (EventLog) để tự động hóa mà không cần dựa vào lệnh ghép ngắn.
  • Trong quá trình triển khai (Intune), hãy chú ý đến phạm vi của các biến và quyền để quyền truy cập được tạo chính xác.

Windows Script Host

Nếu bạn làm việc hàng ngày trên Windows, việc tạo các phím tắt được cấu hình tốt sẽ giúp bạn tiết kiệm rất nhiều lần nhấp chuột và đau đầu. Với Windows Script Host (WSH) và PowerShell Bạn có thể tự động tạo shortcut trên màn hình nền, shortcut menu Bắt đầu, hoặc thậm chí là URL, với các biểu tượng, đối số và thư mục làm việc tùy chỉnh. Trong bài viết này, tôi sẽ biên soạn và viết lại, với phương pháp thực tế, mọi thứ bạn cần để đạt được điều này, dựa trên các ví dụ thực tế. VBScript, Visual FoxPro và PowerShell.

Để đưa điều này vào bối cảnh, Microsoft đã ghi lại khả năng này nhiều năm trước trong cơ sở kiến ​​thức của mình (KB 244677) giải thích cách Tạo lối tắt trên màn hình nền bằng WSH và mở rộng mô hình đối tượng có sẵn. Ngoài ra, chúng ta sẽ xem cách tận dụng Đối tượng mới trong PowerShell để xử lý các đối tượng .NET và COM (bao gồm WSH) và cách giải quyết một số hạn chế của lệnh ghép ngắn từ xa với các lớp .NET như System.Diagnostics.EventLog.

Windows Script Host (WSH) là gì và nó chạy trên hệ thống nào?

Windows Script Host là cơ sở hạ tầng của Microsoft cho phép bạn chạy các tập lệnh VBScript và JScript có sẵn trong Windows. Nó tích hợp một mô hình đối tượng có thể truy cập thông qua COM (ví dụ, WScript.Shell) mà bạn có thể dùng để khởi chạy ứng dụng, thao tác với tệp, đọc Registry, mở hộp thoại và tất nhiên là tạo đường dẫn.

Ở mức độ tương thích, WSH đã được tích hợp sẵn vào Windows 98, Windows 2000 và các phiên bản mới hơn. Đối với Cửa sổ NT 4.0 có thể được cài đặt như một phần của Gói Tùy chọn Windows NT 4.0. Vào thời điểm đó, Microsoft tập trung tải xuống và tài liệu hướng dẫn trên trang web Windows NT 4.0. Scriptingnhưng ngày nay trong Windows hiện đại, bạn đã có thể sử dụng tính năng này mà không cần thêm bước nào nữa.

Trong bối cảnh thực tế, WSH nổi bật vì nó rút gọn các tác vụ vốn rất tẻ nhạt nếu thực hiện thủ công xuống còn vài dòng. Với các đối tượng (Shell, Network, FileSystemObject) và thư mục đặc biệt được xác định rõ ràng, bạn có thể tự động hóa các hành động triển khai và quản trị phần mềm thông thường.

Các phương thức và thuộc tính chính của WshShell cho các phím tắt

Lớp được sử dụng nhiều nhất là WScript.ShellVới nó, bạn sẽ tạo lối tắt và điều chỉnh các thuộc tính của nó. Các phương pháp thực tế bao gồm:

  • Tạo lối tắt: tạo ra .lnk (hoặc .url) trong đường dẫn bạn chỉ định.
  • chạy y Thực thi: Chúng thực hiện các lệnh và quy trình, bất kể chúng có được mong đợi hoàn thành hay không.
  • AppActivate y Gửi khóa: hữu ích cho việc tự động hóa cửa sổ và phím tắt.
  • Popup y Nhật ký sự kiện: Hiển thị thông báo hoặc ghi vào nhật ký sự kiện.
  • Thư mục đặc biệt: trả về đường dẫn thư mục đặc biệt (Desktop, Favorites, v.v.).
  • Ngủ: tạm dừng thực thi trong thời gian đã chỉ định.

Ngoài ra, nó còn thể hiện các đặc tính như Thư mục hiện tại (thư mục hiện tại), Môi trường (biến môi trường) và bộ sưu tập Thư mục đặc biệt (chỉ đọc, với các đường dẫn hệ thống được xác định trước). Các API này được sử dụng như nhau từ cả VBScript và các ngôn ngữ tạo đối tượng COM (ví dụ: PowerShell với New-Object -ComObject).

Tạo lối tắt với WSH trong thực tế

Ý tưởng cơ bản rất đơn giản: bạn tạo ra đối tượng WScript.Shell, bạn tính toán đường dẫn nơi .lnk sẽ được lưu (thường là Máy tính để bàn của người dùng hoặc Máy tính để bàn công cộng) và gọi Tạo lối tắt. Sau đó, bạn cấu hình các thuộc tính phím tắt như TargetPath, Arguments, IconLocation, WorkingDirectory và lưu với Save().

Ví dụ trong Visual FoxPro (thông qua COM WScript.Shell)

Những ví dụ này, được ghi chép lại trong lịch sử cho Visual FoxPro, chứng minh rằng chỉ cần rất ít công sức để tạo ra một tệp .lnk hoạt động với WSH. Tất cả đều sử dụng bộ sưu tập SpecialFolders('Máy tính để bàn') để xác định vị trí Màn hình của người dùng hiện tại.

Ví dụ 1: Phím tắt cơ bản

WshShell = CreateObject("Wscript.shell")
strDesktop = WshShell.SpecialFolders("Desktop")
oMyShortcut = WshShell.CreateShortcut(strDesktop + \\ "Sample.lnk")
oMyShortcut.WindowStyle = 3  && 3=Maximizada, 7=Minimizada, 4=Normal
oMyShortcut.IconLocation = "C:\\myicon.ico"
oMyShortcut.TargetPath = "%windir%\\notepad.exe"
oMyShortCut.Hotkey = "ALT+CTRL+F"
oMyShortCut.Save

Trong khối này được cố định kiểu cửa sổ, biểu tượng, đích đến và phím tắt, tất cả trong một lần. Lưu ý rằng đích hỗ trợ các biến môi trường như %windir%.

Ví dụ 2: Thêm đối số dòng lệnh

WshShell = CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
oMyShortCut = WshShell.CreateShortcut(strDesktop + \\ "Foxtest.lnk")
oMyShortCut.WindowStyle = 7  && 7=Minimizada, 0=Maximizada, 4=Normal
oMyShortcut.IconLocation = home() + "wizards\\graphics\\builder.ico"
oMyShortCut.TargetPath = "c:\\Program Files\\Microsoft Visual Studio\\VFP98\\vfp6.exe"
oMyShortCut.Arguments = "-c " + """ " + Home() + "config.fpw" + """
oMyShortCut.WorkingDirectory = "c:\\"
oMyShortCut.Save

Ngoài điểm đến, ở đây bạn dành một chuỗi lập luận và thư mục làm việc đã được thiết lập. Bài viết cũng hướng dẫn cách tạo dấu ngoặc kép chính xác trong dòng đối số.

Ví dụ 3: Truy cập trực tiếp vào URL

WshShell = CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
oUrlLink = WshShell.CreateShortcut(strDesktop + \\ "Microsoft Web Site.URL")
oUrlLink.TargetPath = "http://www.microsoft.com"
oUrlLink.Save

Nếu bạn thiết lập như Đường dẫn mục tiêu địa chỉ http(s), WSH tạo ra một tệp .url mà trình duyệt mặc định sẽ mở trực tiếp.

Ví dụ trong Visual Basic 6: Xác định vị trí các thư mục đặc biệt và tạo .lnk

Tạo phím tắt bằng Windows Script Host

Một cách tiếp cận cổ điển khác là giải quyết thư mục đặc biệt với Shell API (SHGetSpecialFolderLocation và SHGetPathFromIDList), sau đó gọi CreateObject('WScript.Shell'). Mẫu này hữu ích nếu bạn muốn liệt kê các tùy chọn như Màn hình nền, Chương trình, Mục ưa thích, Bắt đầu, v.v. và cho phép người dùng chọn nơi lưu lối tắt.

' Declaraciones resumidas (VB6)
Private Const CSIDL_DESKTOP = &H0
Private Const CSIDL_PROGRAMS = &H2
Private Const CSIDL_FAVORITES = &H6
Private Const CSIDL_STARTUP = &H7
Private Const CSIDL_RECENT = &H8
Private Const CSIDL_STARTMENU = &HB
Private Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" _
(ByVal hwndOwner As Long, ByVal nFolder As Long, pidl As ITEMIDLIST) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _
(ByVal pidl As Long, ByVal pszPath As String) As Long

' Uso de WScript.Shell para crear el acceso directo en la ruta elegida
Set obj = CreateObject("WScript.Shell")
Set acceso_directo = obj.CreateShortcut(Combo1 & "\\" & Text1)
With acceso_directo
  .TargetPath = App.Path & "\\" & App.EXEName
  .Save
End With
Set obj = Nothing

Mẫu này kết hợp giải quyết các tuyến đường đặc biệt Bằng cách tạo tệp .lnk, giao diện được đề xuất sẽ cung cấp danh sách các đường dẫn hệ thống khác nhau (Màn hình nền, Chương trình, Mục ưa thích, v.v.) và hộp văn bản cho tên phím tắt.

PowerShell: Tạo phím tắt COM và gỡ lỗi trường hợp Intune trong thế giới thực

PowerShell cho phép bạn truy cập COM giống như VBScript, nhưng với cú pháp hiện đại. Cách thông thường để thực hiện việc này là tạo đối tượng WScript.Shell với New-Object và gọi CreateShortcut. Đây là một cách tiếp cận đơn giản và tương thích với tất cả các hệ điều hành Windows hiện đại.

Tạo .lnk trên Desktop của người dùng

$WshShell = New-Object -ComObject WScript.Shell
$lnk = $WshShell.CreateShortcut("$HOME\\Desktop\\PSHome.lnk")
$lnk.TargetPath = $PSHome
$lnk.Save()

Lưu ý sự khác biệt giữa dấu ngoặc đơn và dấu ngoặc kép: với dấu ngoặc kép, PowerShell các biến câu hỏiVí dụ: "$HOME\\Desktop" tạo ra đường dẫn đầy đủ, trong khi '$HOME\\Desktop' giữ nguyên phần nguyên bản không được mở rộng.

Sử dụng New-Object với .NET và COM

# Crear referencias .NET
New-Object -TypeName System.Diagnostics.EventLog
New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

# Crear WSH y otros objetos COM
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

Những dòng này cho thấy PowerShell có thể hoạt động như thế nào với cả hai Các lớp .NET (để vượt qua giới hạn của một số lệnh ghép ngắn từ xa) như với Đối tượng COM (cho các tác vụ như tạo lối tắt).

Tình huống thực tế với Intune: tạo lối tắt đến thư mục Desktop

Một kịch bản triển khai phổ biến với Intune là tạo ra các phím tắt trong một thư mục cụ thể trên Màn hình nền cho mỗi người dùng và, tùy chọn, ghim nó vào Truy cập Nhanh. Dưới đây là một tập lệnh đại diện (tóm tắt) với các hàm bổ trợ, phát hiện xem quy trình có đang chạy dưới dạng HỆ THỐNG hay không và giải quyết các đường dẫn phù hợp cho Màn hình nền và Menu Bắt đầu:

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$true)] [String]$ShortcutTargetPath,
  [Parameter(Mandatory=$true)] [String]$ShortcutDisplayName,
  [Parameter(Mandatory=$false)] [Switch]$PinToStart=$false,
  [Parameter(Mandatory=$false)] [String]$IconFile=$null,
  [Parameter(Mandatory=$false)] [String]$ShortcutArguments=$null,
  [Parameter(Mandatory=$false)] [String]$WorkingDirectory=$null
)

function Add-Shortcut {
  param(
    [Parameter(Mandatory)] [String]$ShortcutTargetPath,
    [Parameter(Mandatory)] [String]$DestinationPath,
    [Parameter()] [String]$WorkingDirectory
  )
  $WshShell = New-Object -ComObject WScript.Shell
  $Shortcut = $WshShell.CreateShortcut($DestinationPath)
  $Shortcut.TargetPath = $ShortcutTargetPath
  $Shortcut.Arguments = $ShortcutArguments
  $Shortcut.WorkingDirectory = $WorkingDirectory
  if ($IconFile) { $Shortcut.IconLocation = $IconFile }
  $Shortcut.Save()
  [Runtime.InteropServices.Marshal]::ReleaseComObject($WshShell) | Out-Null
}

function Test-RunningAsSystem { return ( (whoami -user) -match "S-1-5-18" ) }

function Get-DesktopDir {
  if (Test-RunningAsSystem) { Join-Path -Path $env:PUBLIC -ChildPath "Desktop" }
  else { [Environment]::GetFolderPath("Desktop") }
}

function Get-StartDir {
  if (Test-RunningAsSystem) { Join-Path $env:ALLUSERSPROFILE "Microsoft\\Windows\\Start Menu\\Programs" }
  else { "$([Environment]::GetFolderPath("StartMenu"))\\Programs" }
}

# Preparar la carpeta contenedora en el Escritorio
$DesktopDir = Get-DesktopDir
$ShortcutsFolder = Join-Path $DesktopDir "SharePoint Shortcuts"
if (-not (Test-Path $ShortcutsFolder)) { New-Item -Path $ShortcutsFolder -ItemType Directory | Out-Null }

# Crear el acceso directo
$destinationPath = Join-Path $ShortcutsFolder "$ShortcutDisplayName.lnk"
Add-Shortcut -DestinationPath $destinationPath -ShortcutTargetPath $ShortcutTargetPath -WorkingDirectory $WorkingDirectory

# (Opcional) Crear entrada en el Menú Inicio (Programas)
if ($PinToStart.IsPresent) {
  $destinationPath = Join-Path (Get-StartDir) "$ShortcutDisplayName.lnk"
  Add-Shortcut -DestinationPath $destinationPath -ShortcutTargetPath $ShortcutTargetPath -WorkingDirectory $WorkingDirectory
}

Trong một số kịch bản thực tế, tôi đã thấy những lỗi điển hình: không nắm bắt được giá trị của Lấy-DesktopDir trong một biến (nó được gọi mà không cần gán và sau đó được tham chiếu $DesktopDir mong đợi phương pháp tự thiết lập nó), sự không nhất quán trong tên thư mục (Điểm chia sẻ vs SharePoint) hoặc sử dụng một biến $ShortcutArguments mà không khai báo nó như một tham số của Thêm-Phím tắt. Với mô hình trên, phạm vi nó rõ ràng và mọi thứ đều trôi chảy.

Phím tắt URL, biểu tượng, đối số và các thuộc tính khác

Nhiều thuộc tính phím tắt được điều khiển bằng WSH. Phổ biến nhất là Đường dẫn mục tiêu (đường dẫn đến tệp thực thi hoặc URL), Lập luận (tham số dòng lệnh), Thư mục làm việc (thư mục công việc), Biểu tượngVị trí (tệp biểu tượng có chỉ mục) và Cửa SổPhong Cách (bình thường, phóng to, thu nhỏ).

Ví dụ tối thiểu để tạo ra một .url mở trình duyệt theo tuyến đường công ty:

$WshShell = New-Object -ComObject WScript.Shell
$lnk = $WshShell.CreateShortcut("$HOME\\Desktop\\Intranet.URL")
$lnk.TargetPath = "https://intranet.empresa.local"
$lnk.Save()

Đối với các biểu tượng, hãy nhớ rằng bạn có thể trỏ đến các tệp .ico, .dll hoặc .exe. Nếu biểu tượng nằm trong DLL hoặc EXE có nhiều tài nguyên, hãy thêm ",<index>" vào cuối (ví dụ: "%WinDir%\\System32\\SHELL32.dll,66"). Trong VBScript hoặc VFP, tùy chọn này được thiết lập bằng Biểu tượngVị trí; trong PowerShell, đối tượng COM được trả về bởi CreateShortcut cũng giống hệt như vậy.

Thư mục đặc biệt: Desktop, Start Menu và nhiều hơn nữa

Để các phím tắt của bạn xuất hiện đúng nơi cần thiết, bạn cần giải quyết đúng thư mục. Với WshShell.SpecialFolders Bạn có thể yêu cầu các đường dẫn như 'Desktop' hoặc 'AllUsersDesktop' và với API shell (trong VB6), bạn sẽ nhận được danh sách thậm chí còn mở rộng hơn.

Đây là những mã định danh hữu ích nhất được sử dụng trong các tập lệnh cũ và hiện tại: AllUsersDesktop, AllUsersStartMenu, AllUsersPrograms, AllUsersStartUp, Desktop, Mục ưa thích, Phông chữ, MyDocuments, NetHood, PrintHood, Chương trình, Gần đây, Gửi đến, StartMenu, Khởi động, Mẫu. Chọn từng mục sẽ làm cho phím tắt xuất hiện cho người dùng hiện tại hoặc cho tất cả người dùng, ngay cả trong thư mục 'Chương trình' của Menu Bắt đầu hoặc trong thư mục 'Khởi động' để chạy một chương trình nào đó cùng một lúc. đăng nhập.

Trong một tập lệnh VBScript lịch sử rất đầy đủ (được cho là của một tác giả tên là Fernando vào năm 2010), một tiện ích dòng lệnh đã được cung cấp để tạo các phím tắt .lnk và .url trong bất kỳ thư mục nào trong số này, với các tham số như /Tên (bắt buộc), /Tài liệu (thư mục đặc biệt), / URL o /Ứng dụng (một trong hai, để phân biệt .url với .lnk), /Biểu tượng e /Biểu tượng chỉ mục, /WorkRoute, /Lực lượng y /Đối sốPhần trợ giúp nêu chi tiết cách thức, trong trường hợp .url, tệp kết quả đã được sửa đổi để chèn Tệp biểu tượng e Biểu tượng Index nếu có thể. Logic cũng bao gồm việc sao chép các biểu tượng .ico vào thư mục tạm thời của người dùng nếu cần.

Tự động hóa bổ sung từ PowerShell: .NET, COM và Internet Explorer

Ngoài các phím tắt, PowerShell cho phép bạn sử dụng Các lớp .NET y Đối tượng COM cho nhiều tác vụ quản trị. Một số lệnh cmdlet cổ điển không hoạt động tốt từ xa, vì vậy sử dụng .NET là một cách tuyệt vời để tiết kiệm thời gian.

với System.Diagnostics.EventLog Bạn có thể kết nối với nhật ký sự kiện cục bộ hoặc từ xa, truy vấn vé, xóa nó hoặc ghi sự kiện. Lưu ý cách nó được khởi tạo và cách tên bản ghi (và máy tính từ xa) được truyền dưới dạng đối số xây dựng:

# Registro de Aplicación local
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog.Clear()   # Borrado (requiere permisos adecuados)

# Registro remoto (indicando host o IP)
$RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application, 192.168.1.81
$RemoteAppLog.Clear()

Để tự động hóa các ứng dụng COM, mô hình này giống hệt nhau. Với Ứng dụng InternetExplorer bạn có thể khởi chạy và kiểm soát IE (hữu ích trong môi trường cũ), điều chỉnh Có thể nhìn thấy đến $true và điều hướng với Điều hướng(). Nhớ kết thúc bằng Từ bỏ() và công bố tài liệu tham khảo nếu cần thiết.

Danh mục các nhiệm vụ WSH phổ biến (ý tưởng và ghi nhớ hữu ích)

Ngoài việc tạo ra các phím tắt, WSH đã được sử dụng trong nhiều thập kỷ để tự động hóa các tác vụ hành chính nhỏ. Một tuyển tập kinh điển bao gồm các ví dụ cho in và quản lý kết nối máy in mạng, ánh xạ và xóa ổ đĩa (MapNetworkDrive và RemoveNetworkDrive), liệt kê các tài nguyên mạng với EnumNetworkDrives, mở hộp thoại chọn thư mục, đọc cấu hình khu vực và các giá trị đăng ký với Đã đọc lại, viết vào chạy để bắt đầu chương trình khi khởi động với RegWrite, liệt kê các đường dẫn đặc biệt, đọc tốc độ CPU từ Registry, liên kết phần mở rộng tệp hoặc thậm chí sửa đổi các tổ hợp phím hệ thống trong các phiên bản cũ hơn (chẳng hạn như Ctrl + Alt + Del trong XP/NT) bằng cách thay đổi Registry.

Ngày nay, hầu như tất cả những điều đó đều được che phủ một cách chắc chắn hơn bằng PowerShell và chính sách nhóm hoặc Intune, nhưng WSH vẫn là một Dao Thụy Sĩ tương thích và cực kỳ nhẹ để viết kịch bản một lần.

Ghi chú về khả năng tương thích, bảo mật và thực tiễn tốt nhất

Một số thao tác (ghi vào Tệp chương trình, thay đổi Sổ đăng ký trong HKLM, thao tác Truy cập nhanh hoặc Menu Bắt đầu chung) yêu cầu đặc quyền nâng cao. Đảm bảo bạn chạy PowerShell với quyền quản trị viên khi đích đến yêu cầu hoặc lập kế hoạch triển khai bằng tài khoản hệ thống (ví dụ: trong Intune với ngữ cảnh thiết bị).

Nếu bạn chia sẻ tập lệnh, hãy cân nhắc việc ký chúng, hạn chế việc sử dụng chúng cho nguồn gốc đáng tin cậy và tránh chạy mã tải xuống chưa được kiểm tra. Trong các tình huống kinh doanh, tốt nhất là nên ghi lại lỗi (Thử/Bắt), ghi lại những gì đang xảy ra và áp dụng xác thực tham số nghiêm ngặt để tránh tạo ra sự gián đoạn truy cập hoặc các tuyến đường không mong muốn.

Cuối cùng, hãy nhớ rằng Những thủ tục này chỉ có ý nghĩa trong WindowsMô hình COM và WSH không tồn tại trên macOS hoặc Linux. Khi cần khả năng tương thích chéo, hãy cân nhắc các giải pháp thay thế dành riêng cho hệ thống hoặc các phương pháp dựa trên web.

Tất cả những điều trên đặt lên bàn rằng, với sự kết hợp hợp lý của WSH và PowerShell, bạn có thể tạo các phím tắt trên màn hình nền và menu Bắt đầu với các biểu tượng và đối số, tạo liên kết URL, điều chỉnh kiểu cửa sổ và thư mục làm việc, giải quyết các thư mục đặc biệt cho người dùng hoặc máy tính và tận dụng các lớp .NET và đối tượng COM khi lệnh ghép ngắn không đủ, cục bộ hoặc trong các triển khai được quản lý như Trong giai điệu.