Public/Set-DesktopWallpaper.ps1

function Set-DesktopWallpaper {
    <#
    .SYNOPSIS
        Функия устанавливает обои на Рабочий стол.
    .DESCRIPTION
        Функция вызывает SystemParametersInfo для установки обоев на Рабочий стол.
    .PARAMETER Path
        Путь к изображению.
    .PARAMETER Style
        Стиль размещния изобращения (растянуть, замостить и т.п.).
        Допустимые значения - Tiled, Centered, Stretched и Fit.
    .EXAMPLE
        $cWallpaperImagePath = 'C:\Tools\_aux\pic\Wallpaper23.jpg'
        Set-DesktopWallpaper -Path $cWallpaperImagePath
    .INPUTS
        Путь к файлу с изображением.
    .NOTES
        Функция использует вставку на C# для описания класса "установщика" обоев на Рабочий стол.
        Грубо говоря, все сводится к вызову функции SystemParametersInfo из user32.dll. Подробнее о функции можно почитать на
        https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfow , но легче от этого не станет...
        Сам код найден в Интернте, он там уже давно (как минимум, в 2013 году уже встречался) и информации об авторе найти не удалось.
 
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)]
        [System.String]
        $Path,

        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 1)]
        [ValidateSet('Tiled', 'Centered', 'Stretched', 'Fit')]
        [System.String]
        $Style = 'Stretched'
    )

    begin {
        try {
            $TypeDefinition = @"
using System;
using System.Runtime.InteropServices;
 
namespace Wallpaper
{
    public class Setter {
        public const int SetDesktopWallpaper = 20;
        public const int UpdateIniFile = 0x01;
        public const int SendWinIniChange = 0x02;
 
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern int SystemParametersInfo (int uAction, int uParam, string lpvParam, int fuWinIni);
 
        public static void SetWallpaper (string path) {
            SystemParametersInfo( SetDesktopWallpaper, 0, path, UpdateIniFile | SendWinIniChange );
        }
    }
}
"@


            if (-not ([System.Management.Automation.PSTypeName]'Wallpaper.Setter').Type) {
                Add-Type -TypeDefinition $TypeDefinition
            }
        }
        catch {
            # if ($PSitem.FullyQualifiedErrorId -eq 'TYPE_ALREADY_EXISTS,Microsoft.PowerShell.Commands.AddTypeCommand') {
            # Write-Warning -Message $PSitem.Exception.Message
            # }
            Write-Error -Exception $PSItem.Exception
        }
    }

    process {
        try {
            if ($IsLinux) {
                throw [System.Configuration.ConfigurationException]::New('This operation system does not supported.')
            }

            [Wallpaper.Setter]::SetWallpaper((Convert-Path $Path))

            Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'WallPaper' -Value $Path
            switch ($Style) {
                'Fit' {
                    Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'WallpaperStyle' -Value 6
                    Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'TileWallpaper' -Value 0
                    break
                }
                'Tiled' {
                    Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'WallpaperStyle' -Value 1
                    Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'TileWallpaper' -Value 1
                    break
                }
                'Centered' {
                    Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'WallpaperStyle' -Value 1
                    Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'TileWallpaper' -Value 0
                    break
                }
                Default {
                    Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'WallpaperStyle' -Value 2
                    Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name 'TileWallpaper' -Value 0
                    break
                }
            }
        }
        catch {
            # $PSCmdlet.ThrowTerminatingError($PSitem)
            Write-Error -Exception $PSItem.Exception
        }
    }
    end {

    }
}