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 } } } |