2012-02-25 158 views
14

任何想法和为什么这个工程的建议,从瓦特/ PS运行时,而不是从一个快捷方式运行定义为当:ChangeDesktop.ps1的PowerShell脚本来更改桌面

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -File "C:\Users\bin\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错误。我从桌面快捷方式运行时看不到桌面自动刷新。

划痕头

+1

快捷方式行事很像CMD提示,因此测试快捷命令行出现,而不是在PowerShell提示符。 – 2012-02-26 01:27:00

回答

26

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

[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

+1

非常感谢,安迪。这确实有效。我会保持好奇,为什么从快捷方式运行时,我第一次尝试的其他方法不起作用。 Windows Powershell有时是一个奇怪的野兽 - 至少在我看来,它依然如此。 – joebalt 2012-02-26 01:13:37

+0

@JoeBaltimore我用'rundll32.exe'得到了奇怪的结果。有时候,它会从手动输入的控制台工作,有时不会,有时它会从用快捷方式调用的脚本工作,有时候不会......至少这种方法始终有效:-)它看起来像[其他人](http ://social.technet.microsoft.com/Forums/ar/w7itproui/thread/c5979d78-9732-41a7-8f7b-a9991e318b76)也有更新与'rundll32'壁纸相同的问题。 – 2012-02-26 01:40:39

+0

谢谢。我一直在这方面挣扎数小时。 – Jente 2014-10-07 08:51:01

0

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

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

这个脚本的作品奇迹。对于域部署,我们不希望它每次用户登录时都不断更改背景。

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

它首先映射隐藏的共享,将文件复制到所需的目录,设置壁纸,然后断开隐藏的共享。如果贵公司已经使用“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 
} 
0

通过安迪·阿里斯门迪提供的脚本是真棒!

我用它来作一个有趣的项目 - 设定随机墙纸从网上刮掉。

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

享受!

P.S.如果我正在使用的壁纸网站出现故障或更改其布局,脚本中的拼贴将会变为地狱,但以我的脚本为例,我敢打赌,您可以制作另一个壁纸刮板。

############## 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)