Public/New-NetworkShortcut.ps1

function New-NetworkShortcut {
    <#
        .Synopsis
            Добавляет сетевое размещение в "Этот компьютер"
        .Description
            Создает ярлык на сетевое размещение в папке C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Network Shortcuts
        .Parameter Name
            Имя ярлыка (название папки)
        .Parameter Target
            Путь к подключаемому каталогу
        .Example
            New-NetworkShortcut -Name 'IT-отдел' -Target '\\podsrv-fs01.general.ariel.loc\UserData\general\DepStor\Отдел ИТ'
        .Notes
 
        .Inputs
            Два строковых параметра - имя ярлыка и путь к сетевому размещению.
        .Outputs
            Если указан -PassThru, возвращает объект COM-объект, содержащий созданный ярлык.
 
    #>

    [CmdletBinding()]
    [OutputType([System.__ComObject])]
    Param(
        [Parameter(Mandatory = $True, ValueFromPipeline = $False, Position = 0)]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $Name,
        [Parameter(Mandatory = $True, ValueFromPipeline = $False, Position = 1)]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $Target,
        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 2)]
        [switch]
        $PassThru = $false
    )
    Begin {

    }
    Process {
        try {
            if ($IsLinux) {
                throw [System.Configuration.ConfigurationException]::New('This operation system does not supported.')
            }
            # Если целевой каталог недоступен, нечего и создавать.
            if (Test-Path -Path $Target) {
                # Получаем необходимые пути к папке и файлам.
                $NetworkShortcutsFolderPath = Join-Path -Path $([System.Environment]::GetFolderPath('NetworkShortcuts')) -ChildPath $Name
                $DesktopIniFilePath = Join-Path -Path $NetworkShortcutsFolderPath -ChildPath 'desktop.ini'
                $TargetLnkFilePath = Join-Path -Path $NetworkShortcutsFolderPath -ChildPath 'target.lnk'

                # Содержимое файла desktop.ini
                $DesktopIniFileContent = "[.ShellClassInfo]`r`nCLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}`r`nFlags=2"

                # Если папка уже есть - удаляем.
                ## TODO Вообще, стоило бы делать проверки, что путь назначения существует, что ярлык tagret.lnk ведет куда надо и т.п.
                if (Test-Path -Path $NetworkShortcutsFolderPath -PathType Container) {
                    Remove-Item -Path $NetworkShortcutsFolderPath -Recurse -Force
                }

                # Создаем каталог
                New-Item -Path $NetworkShortcutsFolderPath -ItemType directory | Out-Null
                # Подождем пару секунд, так часто возникали ошибки "Не удалось найти часть пути" при последующих действиях.
                Start-Sleep -Seconds 2

                # Устанавливаем автрибуты папки в "Только чтение".
                Set-ItemProperty -Path $NetworkShortcutsFolderPath -Name Attributes -Value ([System.IO.FileAttributes]::ReadOnly)

                # Создаем файл desktop.ini
                Out-File -FilePath $DesktopIniFilePath -InputObject $DesktopIniFileContent -Encoding ascii

                # Устанавливаем автрибуты папки в "Системный, Скрытый".
                Set-ItemProperty -Path $DesktopIniFilePath -Name Attributes -Value ([System.IO.FileAttributes]::System -bor [System.IO.FileAttributes]::Hidden)

                # Создаем ярлык target.lnk. Для работы с ярлыками у нас пока ещё только "WScript.Shell"...
                $WshShell = New-Object -ComObject 'WScript.Shell'
                $Shortcut = $WshShell.CreateShortcut($TargetLnkFilePath)
                $Shortcut.TargetPath = $Target
                $Shortcut.Save()
            }
            else {
                Write-Warning -Message "Каталог $Target недоступен."
            }

        }
        catch {
            # $PSCmdlet.ThrowTerminatingError($PSitem)
            Write-Error -Exception $PSItem.Exception
        }
    }
    End {
        if (($PassThru) -and ($Shortcut)) {
            return $Shortcut
        }
    }

}