Resolve-ShortcutFile

Если вы похожи на меня, папка «Избранное» вашего браузера полна различными примерами кода на PowerShell. В идеале, было бы великолепно иметь все эти примеры кода в PowerShell, чтобы папка «Избранное» стала библиотекой кода.

Решение такой задачи представляет несколько проблем. Первая (и самая простая для решения) состоит в том, чтобы получить веб-страницу, на которую ссылается ярлык в виде файла .url.

Файлы .url представлены в том же формате, что и файлы .ini (каждая строка состоит из имени свойства, знака = и значения). Таким образом, чтобы получить URL из файла ярлыка, нужно получить содержимое файла с помощью Get-Content, разделить его с помощью Where-Object, найти стартовую метку (url=), и получить все, что после этой метки.

Я решил написать это в виде расширенной функции в CTP3, потомучто я могу задать параметры, работающие как при дополнении по TAB для локальных файлов (например, .\MyShortcut.url), так и для файлов, получаемых от Get-ChildItem. Сделать это чрезвычайно просто благодаря тому как ValueFromPipelineByPropertyName работает с алиасами. В выводе Get-ChildItem, свойство Fullname будет содержать полное имя файла для использования. После того, как я подумал, что fullname – это менее наглядно, чем filename (а я стараюсь показать некоторые новые интересные трюки CTP3), я назвал свой параметр и дал ему алиас FullName. Это означает, что элементы, которые были помещены в конвейер со свойством по имени filename или fullname, заполнят переменную $filename полным путем к файлу.

Вот описание параметра, который принимает как значение вида Resolve-Shortcut .\MyShortcut.url, так и Get-ChildItem -recurse | Resolve-Shortcut:

[Parameter( ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
Position = 0)]
[Alias("FullName")]
[string]
$fileName

Вот расширенная функция Resolve-ShortcutFile:

 
Synopsis: 
Разрешает файл ярлыка на ресурс Интернета в адрес сайта, на который ссылается ярлык 

Syntax: 
Resolve-ShortcutFile [[-fileName] []] [-Verbose] [-Debug] [-ErrorAction []] [-WarningAction []] [-ErrorVariable []] [-WarningVariable []] [-OutVariable []] [-OutBuffer []] [] 

Detailed Description: 
Анализирует файл ярлыка на ресурс Интернета и возвращает значение свойства, содержащего URL, на который ссылается ярлык. 

Examples: 
    -------------------------- EXAMPLE 1 --------------------------





# Разрешает каждый ярлык в папке «Избранное»
Get-ChildItem (Join-Path $env:UserProfile Favorites) -Recurse | Resolve-ShortcutFile
    

Command Parameters: 
Name    Description
fileName Имя файла ярлыка. Имеет алиас FullName, так что возможна работа с выводом командлета Get-ChildItem.

Вот расширенная функция Resolve-ShortcutFile: 
function Resolve-ShortcutFile {
               
    <#
    .Synopsis
        Разрешает файл ярлыка на ресурс Интернета в адрес сайта, на который ссылается ярлык
    .Description
        Анализирует файл ярлыка на ресурс Интернета и возвращает значение свойства, содержащего URL, на который ссылается ярлык.
    .Parameter fileName
        Имя файла ярлыка. Имеет алиас FullName, так что возможна работа с выводом командлета Get-ChildItem.
    .Example
        # Разрешает каждый ярлык в папке «Избранное»
        Get-ChildItem (Join-Path $env:UserProfile Favorites) -Recurse | Resolve-ShortcutFile
    .Link
        Get-Content
    .Link
        Get-Item
    .Link 
        Select-Object
    .Link
        Where-Object           
    #>
    param(
    [Parameter(
        ValueFromPipeline=$true,
        ValueFromPipelineByPropertyName=$true,
        Position = 0)]
    [Alias("FullName")]
    [string]
    $fileName
    )
process {

        if ($fileName -like "*.url") {
            Get-Content $fileName | Where-Object {
                $_ -like "url=*"
            } |
            Select-Object @{
                Name='ShortcutFile'
                Expression = {Get-Item $fileName}
            }, @{
                Name='Url'
                Expression = {$_.Substring($_.IndexOf("=") + 1 )}               
            } 
        }
    
}

}    

Надеюсь, это поможет,

Джеймс Брундаж (James Brundage) [MSFT]