Centrum skryptów - Systemy operacyjne

Jak usunąć skrót z Pulpitu, jeśli nie znam jego ścieżki dostępu?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak usunąć skrót z Pulpitu, jeśli nie znam jego ścieżki dostępu?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Chcę usunąć niektóre skróty z pulpitu; jednak nie wiem, w którym katalogu skróty te mogą się znajdować. Mogą być na przykład w katalogu C:\Documents and Settings\All Users\Desktop lub, powiedzmy, w C:\Documents and Settings\kenmyer\Desktop. Jak mogę je usunąć jeśli nie wiem, gdzie się znajdują?

-- SB

Cześć Skrypciarze! Odpowiedź

Cześć, SB. Zły moment; właśnie ma się zacząć druga połowa meczu UNLV-Georgia Tech. Oglądanie meczu koszykówki w pracy, to już wystarczająco trudne; a jeszcze w tym samym czasie odpowiadać na pytanie skrypciarskie, to już niemal niemożliwe.

Tak czy owak, Skrypciarz piszący te słowa sięgnął do zasobów swojej nadludzkiej mocy, dzięki czemu udało mu się napisać skrypt, przy pomocy którego można wymazać skrót z pulpitu bez względu na to, w jakim katalogu się znajduje:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colItems = objWMIService.ExecQuery _

    ("Select * From Win32_ShortcutFile Where FileName = 'Digital Voice Editor 2'")



For Each objItem in colItems

    If Instr(objItem.Name, "desktop") Then

        strPath = objItem.Name

        strPath = Replace(strPath, "\", "\\")

        Set colFiles = objWMIService.ExecQuery _

            ("Select * From CIM_Datafile Where Name = '" & strpath & "'")

        For Each objFile in colFiles

            objFile.Delete

        Next

    End If

Next

Czy możemy się dowiedzieć jak to działa? Zobaczmy… Virginia, miażdżona przez Albany 66-45 na osiem minut przed końcem, właśnie wzięła przerwę, a zatem odpowiedź brzmi: tak. (Musimy się jednak zmieścić w 30 sekundach!) Mamy tutaj skrót na pulpicie, który nazywa się Digital Voice Editor 2. Chcemy go usunąć, ale nie jesteśmy pewni, w jakim katalogu skrót się znajduje. Czy to jest właśnie problem? Na to wygląda.

Ale jak się okazuje, nie jest to żaden problem. Aby usunąć skrót, zaczynamy od połączenia z usługą WMI na komputerze lokalnym. (Chociaż można łatwo zmodyfikować skrypt tak, by usunąć skróty ze zdalnego komputera: jedyne co trzeba byłoby zrobić, to przypisać zmiennej strComputer nazwę komputera zdalnego). Po połączeniu używamy metody ExecQuery oraz klasy Win32_ShortcutFile, aby zwrotnie otrzymać zbiór skrótów, których parametrem FileName jest Digital Voice Editor 2:

Set colItems = objWMIService.ExecQuery _

    ("Select * From Win32_ShortcutFile Where FileName = 'Digital Voice Editor 2'")

ExecQuery zwraca, jak zawsze zresztą, kolekcję elementów. W tym wypadku jest to zbiór skrótów o nazwie Digital Voice Editor 2. Następnym krokiem będzie założenie pętli For Each, która przejdzie przez całą kolekcję:

For Each objItem in colItems

Pierwszy krok wewnątrz pętli jest tak naprawdę opcjonalny. Ponieważ SB wspomina konkretnie o skrótach na pulpicie, użyjemy funkcji InStr, aby określić czy wewnątrz właściwości Name pliku pojawia się słowo desktop (która, przynajmniej w klasie Win32_ShortcutFile, odpowiada ścieżce pliku):

If Instr(objItem.Name, "desktop") Then

To umożliwia nam usunięcie skrótów z Pulpitu, jednocześnie pozostawiając, powiedzmy, skróty z Menu Start. Chcąc usunąć wszystkie skróty do plików (bez względu na to, czy są one na Pulpicie, czy nie), powinniśmy usunąć instrukcję If-Then.

Jak widać, wewnątrz pętli przypisaliśmy właściwość Name pliku do zmiennej nazwanej strPath. I dalej mamy taki wiersz kodu:

strPath = Replace(strPath, "\", "\\")

Co nam ten fragment daje? Nasza ścieżka pliku będzie mniej więcej taka: C:\Documents and Settings\All Users\Desktop\Digital Voice Editor 2.lnk. Nie ma w tym nic złego, tak właśnie powinna wyglądać ścieżka pliku. Jednak, by naprawdę usunąć skrót musimy użyć tej ścieżki w zapytaniu WMI. I to jest problem, ponieważ znak „\” jest zarezerwowany i nie może być tam użyty bez poprzedzenia go tym samym znakiem.

I to jest właśnie powód, dla którego używamy funkcji Replace: zamieniamy każdy znak „\” na „\\” Daje nam to ścieżkę (przechowywaną w zmiennej strPath), która wygląda następująco: C:\\Documents and Settings\\All Users\\Desktop\\Digital Voice Editor 2.lnk.

A takiej ścieżki możemy już użyć w zapytaniu WQL:

Set colFiles = objWMIService.ExecQuery _

    ("Select * From CIM_Datafile Where Name = '" & strpath & "'")

Jak działa takie zapytanie? Otóż zwraca nam ono zbiór plików o właściwości Name (czyli ścieżce) równej wartości zmiennej strPath. Teraz użyjemy następującego kodu, by przejść pętlą przez ten zbiór i usunąć odpowiedni skrót pliku:

For Each objFile in colFiles

    objFile.Delete

Next

I powtarzamy procedurę na wypadek istnienia innych skrótów o nazwie Digital Voice Editor 2, które również chcemy przecież usunąć.

Mamy nadzieję, że informacje okażą się pomocne, SB. Jeśli chodzi o Skrypciarza piszącego te słowa, to nic go nie pocieszy, ma niezbyt dobry dzień. W czasie lunchu na stołówce ustawiono telewizor. Koszykówka uniwersytecka? Niestety, nie: leciał mecz krykieta. Najwyraźniej Microsoft stracił wyczucie, co jest ważne, a co nie.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne