Jeśli pracujesz codziennie w systemie Windows, tworzenie dobrze skonfigurowanych skrótów oszczędzi Ci wielu kliknięć i nerwów. Host skryptów systemu Windows (WSH) i program PowerShell Możesz zautomatyzować tworzenie skrótów na pulpicie, w menu Start, a nawet w adresach URL, korzystając z niestandardowych ikon, argumentów i folderów roboczych. W tym artykule, w praktyczny sposób, kompiluję i przepisuję wszystko, czego potrzebujesz, aby to osiągnąć, w oparciu o przykłady z życia wzięte. VBScript, Visual FoxPro i PowerShell.
Aby umieścić to w kontekście, firma Microsoft udokumentowała tę możliwość kilka lat temu w swojej bazie wiedzy (KB 244677), wyjaśniając, jak Generuj skróty na pulpicie za pomocą WSH i rozszerzając dostępny model obiektowy. Ponadto zobaczymy, jak wykorzystać Nowy obiekt w programie PowerShell do obsługi obiektów .NET i COM (w tym WSH) oraz jak obejść ograniczenia zdalnych poleceń cmdlet za pomocą klas .NET, takich jak System.Diagnostics.EventLog.
Czym jest Windows Script Host (WSH) i na jakich systemach działa?
Windows Script Host to infrastruktura firmy Microsoft umożliwiająca uruchamianie skryptów VBScript i JScript natywnie w systemie Windows. Integruje model obiektowy dostępny przez COM (na przykład słynny WScript.Shell) za pomocą którego można uruchamiać aplikacje, manipulować plikami, odczytywać rejestr, otwierać okna dialogowe i oczywiście tworzyć skróty.
Na poziomie kompatybilności WSH został zintegrowany od razu po wyjęciu z pudełka Windows 98, Windows 2000 i nowsze wersje. Dla Windows System NT 4.0 można było zainstalować w ramach pakietu Option Pack systemu Windows NT 4.0. W tamtym czasie firma Microsoft scentralizowała pobieranie plików i udostępnianie dokumentacji na stronie internetowej systemu Windows NT 4.0. Scripting, ale dziś w nowoczesnych systemach Windows jest to już możliwe bez konieczności wykonywania dodatkowych czynności.
W praktyce WSH sprawdza się znakomicie, ponieważ redukuje zadania, które byłyby żmudne do wykonania ręcznie, do kilku linijek. Dzięki swoim obiektom (Shell, Network, FileSystemObject) i specjalne foldery dobrze zdefiniowane, można zautomatyzować typowe czynności związane z administracją oprogramowania i wdrażaniem.
Kluczowe metody i właściwości WshShell dla skrótów
Najczęściej używaną klasą jest WScript.ShellDzięki niemu utworzysz skrót i dostosujesz jego właściwości. Jego praktyczne metody obejmują:
- Utwórz skrót: generuje plik .lnk (lub .url) w podanej ścieżce.
- Uruchom y Exec:Wykonują polecenia i procesy, niezależnie od tego, czy oczekuje się od nich ich ukończenia.
- Aktywacja aplikacji y Wyślij klucze:przydatne do automatyzacji okien i naciśnięć klawiszy.
- Popup y Zdarzenie dziennika: Wyświetlaj komunikaty lub zapisuj do dziennika zdarzeń.
- Specjalne foldery: zwraca ścieżki do folderów specjalnych (Pulpit, Ulubione itp.).
- sen: wstrzymuje wykonywanie na określony czas.
Ponadto wykazuje właściwości takie jak: Bieżący katalog (bieżący katalog), Środowisko (zmienne środowiskowe) i kolekcja Specjalne foldery (tylko do odczytu, z predefiniowanymi ścieżkami systemowymi). Te API są używane zarówno w języku VBScript, jak i w językach, które tworzenie obiektów COM (np. PowerShell z poleceniem New-Object -ComObject).
Tworzenie skrótów z WSH w praktyce
Podstawowy pomysł jest prosty: tworzysz obiekt WScript.Shell, obliczasz ścieżkę, na której zostanie zapisany plik .lnk (zwykle pulpit użytkownika lub pulpit publiczny) i wywołujesz Utwórz skrótNastępnie należy skonfigurować właściwości skrótu, takie jak TargetPath, Argumenty, IconLocation, WorkingDirectory i zapisuje za pomocą Save().
Przykłady w Visual FoxPro (za pośrednictwem COM WScript.Shell)
Te przykłady, historycznie udokumentowane dla Visual FoxPro, pokazują, jak niewiele potrzeba, aby utworzyć działający plik .lnk za pomocą WSH. Wszystkie korzystają z kolekcji Specjalne Foldery('Pulpit') aby zlokalizować pulpit bieżącego użytkownika.
Przykład 1: Podstawowy skrót
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
W tym bloku są naprawione styl okna, ikona, miejsce docelowe i skrót klawiaturowy, wszystko na raz. Należy pamiętać, że miejsce docelowe obsługuje zmienne środowiskowe, takie jak %windir%.
Przykład 2: Dodawanie argumentów wiersza poleceń
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
Oprócz miejsca docelowego, tutaj spędzisz łańcuch argumentów i folder roboczy jest ustawiony. Pokazuje również, jak poprawnie tworzyć cudzysłowy w wierszu argumentów.
Przykład 3: Bezpośredni dostęp do adresu 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
Jeśli ustawisz jako Ścieżka docelowa adres http(s), WSH generuje plik .url, który zostanie bezpośrednio otwarty w domyślnej przeglądarce.
Przykład w Visual Basic 6: Zlokalizuj specjalne foldery i utwórz plik .lnk

Innym klasycznym podejściem było rozwiązanie specjalne foldery za pomocą interfejsu API powłoki (SHGetSpecialFolderLocation i SHGetPathFromIDList), a następnie wywołaj funkcję CreateObject('WScript.Shell'). Ten wzorzec jest przydatny, jeśli chcesz wyświetlić opcje takie jak Pulpit, Programy, Ulubione, Start itp. i umożliwić użytkownikowi wybór miejsca zapisania skrótu.
' 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
Ta próbka łączy rozwiązanie tras specjalnych Po utworzeniu pliku .lnk sugerowany interfejs oferował listę różnych ścieżek systemowych (Pulpit, Programy, Ulubione itd.) oraz pole tekstowe do wpisania nazwy skrótu.
PowerShell: Tworzenie skrótów COM i debugowanie w rzeczywistym przypadku usługi Intune
PowerShell umożliwia dostęp do COM tak samo jak VBScript, ale z wykorzystaniem nowoczesnej składni. Standardowym sposobem jest utworzenie obiektu. WScript.Shell z New-Object i wywołaniem CreateShortcut. To proste podejście, kompatybilne ze wszystkimi nowoczesnymi systemami operacyjnymi Windows.
Utwórz plik .lnk na pulpicie użytkownika
$WshShell = New-Object -ComObject WScript.Shell
$lnk = $WshShell.CreateShortcut("$HOME\\Desktop\\PSHome.lnk")
$lnk.TargetPath = $PSHome
$lnk.Save()
Zwróć uwagę na różnicę między pojedynczymi i podwójnymi cudzysłowami: w przypadku podwójnych cudzysłowów program PowerShell pytania zmienneNa przykład: „$HOME\\Desktop” generuje pełną ścieżkę, podczas gdy „$HOME\\Desktop” pozostawia literał bez rozwinięcia.
Używanie New-Object z .NET i 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
Te wiersze pokazują, jak program PowerShell może działać z obydwoma Klasy .NET (aby zdalnie pokonać ograniczenia niektórych poleceń cmdlet) jak w przypadku Obiekty COM (do zadań takich jak tworzenie skrótów).
Scenariusz z życia wzięty z Intune: tworzenie skrótów do folderu na pulpicie
Typowy scenariusz wdrożenia z użyciem usługi Intune polega na generowaniu skróty w określonym folderze na pulpicie dla każdego użytkownika i opcjonalnie przypiąć go do Szybkiego dostępu. Poniżej znajduje się przykładowy (streszczony) skrypt z funkcjami pomocniczymi, który wykrywa, czy proces działa jako SYSTEM, i ustala odpowiednie ścieżki dla pulpitu i menu Start:
[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
}
W kilku prawdziwych skryptach widziałem typowe błędy: nieuchwycenie wartości Pobierz-DesktopDir w zmiennej (wywołano ją bez przypisania, a następnie odwołano się do niej) $DesktopDir (oczekując, że sama metoda to ustawi), nieścisłości w nazwie folderu (Sharepoint vs SharePoint) lub użycie zmiennej $ArgumentySkrótu bez deklarowania go jako parametru Dodaj-Skrót. Przy powyższym wzorze, zakres jest przejrzyście i wszystko płynie.
Skróty URL, ikony, argumenty i inne właściwości
Wiele właściwości skrótów jest kontrolowanych za pomocą WSH. Najczęściej spotykane to: Ścieżka docelowa (ścieżka do pliku wykonywalnego lub adres URL), Argumenty (parametry wiersza poleceń), WorkingDirectory (folder roboczy), IkonaLokalizacja (plik ikony z indeksem) i Styl okna (normalny, zmaksymalizowany, zminimalizowany).
Minimalny przykład tworzenia .url który otwiera przeglądarkę w ścieżce korporacyjnej:
$WshShell = New-Object -ComObject WScript.Shell
$lnk = $WshShell.CreateShortcut("$HOME\\Desktop\\Intranet.URL")
$lnk.TargetPath = "https://intranet.empresa.local"
$lnk.Save()
Pamiętaj, że w przypadku ikon możesz wskazać pliki .ico, .dll lub .exeJeśli ikona znajduje się w pliku DLL lub EXE z wieloma zasobami, dodaj na końcu „<index>” (np. „%WinDir%\\System32\\SHELL32.dll,66”). W VBScript lub VFP ustawia się to za pomocą IkonaLokalizacja; w PowerShellu dzieje się dokładnie to samo w obiekcie COM zwróconym przez CreateShortcut.
Foldery specjalne: Pulpit, Menu Start i inne
Aby skróty pojawiały się tam, gdzie powinny, musisz wskazać właściwy folder. WshShell.SpecialFolders Możesz poprosić o ścieżki takie jak „Pulpit” lub „AllUsersDesktop”, a za pomocą interfejsu API powłoki (w VB6) otrzymasz jeszcze bardziej obszerną listę.
Oto najprzydatniejsze identyfikatory używane w starszych i obecnych skryptach: AllUsersDesktop, AllUsersStartMenu, AllUsersPrograms, AllUsersStartUp, Pulpit, Ulubione, Czcionki, Moje dokumenty, NetHood, PrintHood, Programy, Ostatnie, Wyślij do, Menu startowe, StartUp, SzablonyWybranie każdego z nich spowoduje wyświetlenie skrótu dla bieżącego użytkownika lub dla wszystkich użytkowników, nawet w folderze „Programy” w menu Start lub w folderze „Uruchomienie”, aby uruchomić coś naraz. zaloguj się.
W bardzo kompletnym historycznym skrypcie VBScript (przypisywanym autorowi o nazwisku Fernando w 2010 r.) zaproponowano narzędzie wiersza poleceń umożliwiające tworzenie skrótów .lnk i .url w dowolnym z tych folderów, z parametrami takimi jak /Nazwa (obowiązkowy), /Plik (specjalny folder), / URL o /Aplikacja (jeden z dwóch, pozwalający odróżnić .url od .lnk), /Ikona e /IndeksIkona, /Trasa robocza, /Siła y /ArgumentyW pomocy szczegółowo opisano, jak w przypadku .url zmodyfikowano wynikowy plik, aby wstawić IconFile e IconIndex jeśli ma to zastosowanie. Logika uwzględniała również kopiowanie ikon .ico do folderu tymczasowego użytkownika, jeśli było to konieczne.
Dodatkowa automatyzacja z programu PowerShell: .NET, COM i Internet Explorer
Oprócz skrótów PowerShell umożliwia korzystanie Klasy .NET y Obiekty COM do wielu zadań administracyjnych. Niektóre klasyczne polecenia cmdlet nie działają dobrze zdalnie, dlatego użycie .NET to świetny sposób na ratunek.
z System.Diagnostics.EventLog Możesz połączyć się z lokalnym lub zdalnym rejestrem zdarzeń, sprawdzić bilety, wymaż to lub zapisuj zdarzenia. Zwróć uwagę na sposób ich tworzenia i sposób przekazywania nazwy rekordu (i komputera zdalnego) jako argumentów konstruktora:
# 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()
Aby zautomatyzować aplikacje COM, wzór jest identyczny. InternetExplorer.Aplikacja możesz uruchomić i kontrolować IE (przydatne w starszych środowiskach), dostosować Statystyki do $true i nawiguj za pomocą Nawigować()Pamiętaj, aby zakończyć Zrezygnować() i w razie potrzeby udostępnij odnośniki.
Katalog typowych zadań WSH (przydatne pomysły i wspomnienia)
Oprócz tworzenia skrótów, WSH jest od dziesięcioleci używany do automatyzacji drobnych zadań administracyjnych. Klasyczny kompendium zawiera przykłady drukowanie i zarządzanie połączeniami drukarek sieciowych, mapuj i usuwaj dyski (MapNetworkDrive i RemoveNetworkDrive), wyświetlaj zasoby sieciowe za pomocą Wylicz dyski sieciowe, otwórz okno dialogowe wyboru folderu, przeczytaj konfiguracja regionalna i wartości rejestru z Odczyt, napisz w Uruchom aby uruchamiać programy przy starcie za pomocą RegWrite, wyświetl specjalne ścieżki, odczytaj prędkość procesora z rejestru, skojarz rozszerzenia plików, a nawet zmodyfikuj kombinacje klawiszy systemowych w starszych wersjach (takich jak Ctrl + Alt + Del w XP/NT) poprzez zmiany w Rejestrze.
Dzisiaj prawie wszystko to jest objęte bardziej kompleksową opieką PowerShell i zasady grupy lub Intune, ale WSH nadal jest szwajcarski nóż kompatybilny i wyjątkowo lekki, do tworzenia jednorazowych skryptów.
Notatki dotyczące zgodności, bezpieczeństwa i najlepszych praktyk
Niektóre operacje (zapisywanie do plików programów, zmiana rejestru w HKLM, manipulowanie szybkim dostępem lub wspólnym menu Start) wymagają podwyższone przywilejeUpewnij się, że uruchamiasz program PowerShell z uprawnieniami administratora, gdy wymaga tego miejsce docelowe, lub zaplanuj wdrożenie przy użyciu konta systemowego (na przykład w usłudze Intune z uwzględnieniem kontekstu urządzenia).
Jeśli udostępniasz skrypty, rozważ ich podpisanie, ograniczając ich użycie do zaufane pochodzenie i unikaj uruchamiania niesprawdzonego pobranego kodu. W scenariuszach biznesowych dobrym pomysłem jest rejestrowanie błędów (tryb/catch), rejestrowanie zdarzeń i stosowanie walidacja parametrów ścisłe, aby uniknąć generowania przerwanego dostępu lub nieoczekiwanych tras.
Na koniec pamiętaj o tym Te procedury mają sens tylko w systemie WindowsModel COM i WSH nie istnieje w systemach macOS ani Linux. Jeśli wymagana jest kompatybilność krzyżowa, należy rozważyć alternatywy specyficzne dla danego systemu lub rozwiązania internetowe.
Wszystko powyższe stawia na szali to, że przy rozsądnym połączeniu WSH i PowerShellMożesz tworzyć skróty pulpitu i menu Start z ikonami i argumentami, generować łącza URL, dostosowywać style okien i foldery robocze, rozwiązywać specjalne foldery dla użytkownika lub komputera oraz wykorzystywać klasy .NET i obiekty COM, gdy polecenia cmdlet zawodzą, lokalnie lub w zarządzanych wdrożeniach, takich jak Nastrojony.