2012-02-25 57 views
14

Todas las ideas y sugerencias sobre por qué esto funciona cuando se ejecuta desde w/PS, pero no cuando se ejecuta desde un acceso directo definido como:script de PowerShell de acceso directo para cambiar de escritorio

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

Contenido de ChangeDesktop.ps1:

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

Si estoy en el entorno de "petición de comando" del PS, el fondo del escritorio se elimina y actualiza automáticamente, además de eso tengo que actualizar manualmente el escritorio para efectuar el cambio.

El sistema es Windows Server 2008 R2 - nueva instalación. La política de ejecución de scripts está configurada en RemoteSigned, y no veo ningún error de PS. Simplemente no veo la actualización del escritorio automáticamente cuando se ejecuta desde un atajo de escritorio.

arañazos cabeza

+1

atajos actúan mucho como el símbolo del CMD, por lo que las líneas de comandos de acceso directo prueba allí, no en la línea de PowerShell. –

Respuesta

26

rundll32.exe user32.dll, UpdatePerUserSystemParameters en realidad no cambiar el fondo de pantalla para mí en una caja 2008 x64. Esto sí lo hizo ... Llama a la API de Win32 para invocar el cambio del fondo de pantalla. Si guarda esto como su script ChangeDesktop.ps1 debería funcionar. Como está debajo, eliminará cualquier fondo de escritorio. Sin embargo, si usted desea establecer uno puede editar la última línea con la trayectoria de un archivo de imagen con el apoyo de esta manera:

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

El segundo argumento es que el estilo:

0: Teja 1: centro 2: estiramiento 3: Sin cambio

El guión:

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) 

Originalmente desde PoshCode: http://poshcode.org/491

+1

Muchas gracias, Andy. Esto de hecho funciona Voy a seguir siendo curioso acerca de por qué el otro método que probé por primera vez no funciona cuando se ejecuta desde el acceso directo. Windows Powershell es una bestia extraña a veces, al menos para mí todavía lo es. – joebalt

+0

@JoeBaltimore Tuve resultados extraños con 'rundll32.exe'. A veces funcionaría desde la consola ingresada manualmente, a veces no, a veces funcionaría desde un script invocado con el acceso directo, a veces no ... Al menos este enfoque funciona todo el tiempo :-) Parece que [otras personas] (http : //social.technet.microsoft.com/Forums/ar/w7itproui/thread/c5979d78-9732-41a7-8f7b-a9991e318b76) han tenido el mismo problema al actualizar el fondo de pantalla con 'rundll32' también. –

+0

Gracias. He estado luchando durante horas en esto. – Jente

0

Esto podría ser extraño, pero lo que funcionó para mí fue el uso de comillas simples en lugar de dobles. Así se vería así:

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

Este script funciona de maravilla. Para una implementación de dominio, no deseamos que cambie continuamente el fondo cada vez que un usuario inicia sesión.

Realicé los siguientes cambios para verificar si el fondo existe en la computadora en la ubicación deseada, si existe, entonces salga, si no continúa con la copia del archivo y configure el fondo.

primero asigna el recurso compartido oculto, copia el archivo en el directorio deseado, establece el fondo de pantalla y luego desconecta el recurso compartido oculto. si su empresa ya usa "X", inserte otra letra de unidad. : 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

La secuencia de comandos proporcionada por Andy Arismendi es increíble!

lo he usado para hacer un proyecto divertido - establecer un fondo de pantalla al azar raspado de la red.

Lo estoy publicando aquí para cualquier persona interesada.Antes de usarlo, debe cambiar algunas constantes en la parte superior del origen del script. También debe descargar la biblioteca HtmlAgilityPack.dll (hay instrucciones en los comentarios del script).

¡Disfrútalo!

P.S. Si el sitio de fondo de pantalla que estoy usando se cae o cambia su diseño, el raspado en el guión se irá al carajo, pero sin embargo con mi guión como ejemplo apuesto a que podrás construir otro raspador de fondo de pantalla.

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