PowerShell脚本从快捷方式更改桌面

任何想法和build议,为什么这个工作时,从PS运行,而不是从一个快捷方式运行定义为:

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -File "C:\Users\bin\ChangeDesktop.ps1" 

ChangeDesktop.ps1的内容:

 set-itemproperty -path "HKCU:Control Panel\Desktop" -name WallPaper -value "" rundll32.exe user32.dll, UpdatePerUserSystemParameters 

如果我在PS“命令提示符”环境中,桌面背景会自动删除并刷新,除此之外,我必须手动刷新桌面才能进行更改。

系统是Windows Server 2008 R2 – 全新安装。 Script executionpolicy被设置为RemoteSigned,并且我没有看到任何PS错误。 我只是从桌面快捷方式运行时看不到桌面自动刷新。

抓头

rundll32.exe user32.dll, UpdatePerUserSystemParameters实际上并没有改变我在2008年的x64框上的壁纸。 这样做虽然…它调用Win32 API来调用更改壁纸。 如果您将其保存为您的ChangeDesktop.ps1脚本,它应该工作。 因为它下面会删除任何桌面壁纸。 但是,如果你想设置一个你可以编辑最后一行支持的图像文件的path,如下所示:

 [Wallpaper.Setter]::SetWallpaper( 'C:\Wallpaper.bmp', 0 ) 

第二个参数是造型:

0:瓷砖1:中心2:拉伸3:无变化

剧本:

 Add-Type @" using System; using System.Runtime.InteropServices; using Microsoft.Win32; namespace Wallpaper { public enum Style : int { Tile, Center, Stretch, NoChange } 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, Wallpaper.Style style ) { SystemParametersInfo( SetDesktopWallpaper, 0, path, UpdateIniFile | SendWinIniChange ); RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true); switch( style ) { case Style.Stretch : key.SetValue(@"WallpaperStyle", "2") ; key.SetValue(@"TileWallpaper", "0") ; break; case Style.Center : key.SetValue(@"WallpaperStyle", "1") ; key.SetValue(@"TileWallpaper", "0") ; break; case Style.Tile : key.SetValue(@"WallpaperStyle", "1") ; key.SetValue(@"TileWallpaper", "1") ; break; case Style.NoChange : break; } key.Close(); } } } "@ [Wallpaper.Setter]::SetWallpaper( '', 0 ) 

最初来自PoshCode: http ://poshcode.org/491

这可能会很奇怪,但是对我而言,使用单引号而不是双引号。 所以它看起来像这样:

 Set-ItemProperty -path "HKCU:Control Panel\Desktop" -name 'wallpaper' -value 'some value' rundll32.exe user32.dll, UpdatePerUserSystemParameters 

Andy Arismendi提供的脚本非常棒!

我用它来制作一个有趣的项目 – 从网上设置一个随机壁纸

我在这里发布任何感兴趣的人。 在使用之前,您需要在脚本源代码顶部更改一些常量。 您还需要下载HtmlAgilityPack.dll库(脚本注释中有说明)。

请享用!

PS如果我正在使用的壁纸网站下降或更改其布局在脚本中的刮将会下地狱,但以我的脚本作为例子,我敢打赌,你将能够build立另一个壁纸刮板。

 ############## CONSTANTS ############## # add the library for parsing html - HtmlAgilityPack - download it with nuget from https://www.nuget.org/packages/HtmlAgilityPack # download nuget command line from https://dist.nuget.org/index.html and install HtmlAgilityPack with "nuget install HtmlAgilityPack" from the cmd # enter the path to HtmlAgilityPack.dll library used for html parsing $html_parser_path = "C:\Users\username\Documents\htmlagilitypack\HtmlAgilityPack.1.4.9.5\lib\Net20\HtmlAgilityPack.dll" # choose where your wallpapers will be downloaded $wallpaper_dir_path = "C:\Users\username\Pictures\" # get random wallpaper category from wallpaperscraft.com - the ones below are my favourite categories, edit it if you want to get other categories <# you can choose your favorite wallpaper categories from the list below 3D Abstract Animals Anime Brands Cars City Fantasy Flowers Food Games Girls Hi-Tech Holidays Macro Men Movies Music Nature Other Space Sport Textures TV Series Vector #> $categories = @("animals","flowers","macro","nature","space") # I download my wallpapers from the site below - real quality wallpapers # don't forget to change your resolution - I'm using a 1920x1080 monitor <# A list of resolutions to choose from: 1600x1200 1400x1050 1280x1024 1280x960 1152x864 1024x768 3840x2400 3840x2160 3840x1200 2560x1600 2560x1440 2560x1080 2560x1024 2048x1152 1920x1200 1920x1080 1680x1050 1600x900 1440x900 1280x800 1280x720 2160x3840 1440x2560 1366x768 1080x1920 1024x600 960x544 800x1280 800x600 720x1280 540x960 480x854 480x800 400x480 360x640 320x480 320x240 240x400 240x320 2732x2732 2048x2048 1080x1920 1024x1024 750x1334 640x1136 640x960 320x480 1366x768 1920x1080 360x640 1024x768 1600x900 1280x900 1440x900 1280x1024 800x600 1680x1050 2560x1440 320x480 1920x1200 480x800 720x1280 #> $resolution = "1920x1080" # default resolution $url = "https://wallpaperscraft.com/catalog/category/$resolution" # category is a placeholder ############## END OF CONSTANT DECLARATIONS ############## Add-Type @" using System; using System.Runtime.InteropServices; using Microsoft.Win32; namespace Wallpaper { public enum Style : int { Tile, Center, Stretch, NoChange } 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, Wallpaper.Style style ) { SystemParametersInfo( SetDesktopWallpaper, 0, path, UpdateIniFile | SendWinIniChange ); RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true); switch( style ) { case Style.Stretch : key.SetValue(@"WallpaperStyle", "2") ; key.SetValue(@"TileWallpaper", "0") ; break; case Style.Center : key.SetValue(@"WallpaperStyle", "1") ; key.SetValue(@"TileWallpaper", "0") ; break; case Style.Tile : key.SetValue(@"WallpaperStyle", "1") ; key.SetValue(@"TileWallpaper", "1") ; break; case Style.NoChange : break; } key.Close(); } } } "@ Add-Type -Path $html_parser_path $rand_index = Get-Random -minimum 0 -maximum $categories.Length $random_category = $categories[$rand_index] # replace the placeholder "category" with the random category chosen above $url = $url -replace "category", $random_category $doc = New-Object HtmlAgilityPack.HtmlDocument $doc.LoadHtml((New-Object System.Net.WebClient).DownloadString($url)) # NOTE: the html parser I'm using locates elements by XPath only $page_links = $doc.DocumentNode.SelectSingleNode("//div[contains(@class, 'pages')]").SelectNodes("a") # get last page link $last_page_link = $page_links[$page_links.Count - 1].GetAttributeValue("href", "") # get last page number $last_page_number = [regex]::match($last_page_link,'.*page(\d+)').Groups[1].Value $random_page_number = Get-Random -minimum 0 -maximum $last_page_number $random_page_addr = "" # page 1 doesn't add anything to the url if ($random_page_number -gt 0){ $random_page_addr = "/page$random_page_number" } $doc.LoadHtml((New-Object System.Net.WebClient).DownloadString("$url$random_page_addr")) # get wallpaper divs $wallpaper_divs = $doc.DocumentNode.SelectNodes("//div[contains(@class, 'wallpaper_pre')]") $random_wallpaper_div = Get-Random -minimum 0 -maximum 15 # there are 15 wallpapers on a page # get a sample wallpaper link which has to be substituted later $sample_wallpaper_link = $wallpaper_divs[$random_wallpaper_div].SelectNodes("a")[0].GetAttributeValue("href", "") # substitute the above link to get the image link itself $sample_wallpaper_link = $sample_wallpaper_link -replace "download", "image" $sample_wallpaper_link = $sample_wallpaper_link -replace "/$resolution", "_$resolution.jpg" $sample_wallpaper_link = $sample_wallpaper_link -replace "//", "https://" $wallpaper_image_name = [regex]::match($sample_wallpaper_link,'.*image/(\w+)').Groups[1].Value $wallpaper_image_name = "$wallpaper_image_name.jpg" $wc = New-Object System.Net.WebClient $save_location = "$wallpaper_dir_path$wallpaper_image_name" $wc.DownloadFile($sample_wallpaper_link, "$save_location") [Wallpaper.Setter]::SetWallpaper($save_location, 1 ) 

这个脚本创造奇迹。 对于域部署,我们不希望每次用户login时不断更改背景。

我做了以下更改,以便检查计算机上的背景是否存在于所需的位置,如果确实存在,则退出,如果不继续进行文件复制并设置背景。

它首先映射隐藏的共享,将文件复制到所需的目录,设置壁纸,然后断开隐藏的共享。 如果公司已经使用了“X”,则插入另一个驱动器号。 :d

 $strFileName="C:\Users\Public\Pictures\background.jpg" If (Test-Path $strFileName){ # // File exists Exit-PSSession }Else{ # // File does not exist New-PSDrive -Name X -PSProvider Filesystem -Root \\hiddenfileshare\wallpapers Copy-Item X:\background.jpg C:\Users\Public\Pictures [Wallpaper.Setter]::SetWallpaper( 'C:\Users\Public\Pictures\background.jpg', 0 ) Remove-PSDrive X }