2011-05-27 228 views
5

我發現了一個PowerShell script,它可以更改我的Windows 7 PC的桌面牆紙,其圖像文件的路徑作爲參數提供。我想要的最終結果是在啓動時通過批處理文件調用此腳本。PowerShell腳本第一次失敗,但第二次運行

[CmdletBinding()] 
Param(
    [Parameter(Position=0, Mandatory=$true, ValueFromPipelineByPropertyName=$true)] 
    [Alias("FullName")] 
    [string] 
    $Path 
, 
    [Parameter(Position=1, Mandatory=$false)] 
    $Style = "NoChange" 
) 

BEGIN { 
try { 
    $WP = [Wallpaper.Setter] 
} catch { 
    $WP = 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(); 
    } 
    } 
} 
"@ -Passthru 
} 
} 
PROCESS { 
    Write-Verbose "Setting Wallpaper ($Style) to $(Convert-Path $Path)" 
    $WP::SetWallpaper((Convert-Path $Path), $Style) 
} 

我使用的命令調用該腳本:

C:\scripts\Set-Wallpaper.ps1 C:\Users\myProfile\Pictures\MyWallpaper.jpg

我完全新的PowerShell腳本的世界,我遇到的問題是,當我執行腳本在PowerShell它始終未能在第一時間與以下錯誤:

C:\scripts\Set-Wallpaper.ps1 : Unable to cast object of type 'System.Object[]' to type 'System.Type'.

At line:1 char:29

  • C:\scripts\Set-Wallpaper.ps1 <<<< C:\Users\mbaleato\Pictures\MyWallpaper.jpg
    • CategoryInfo : NotSpecified: (:) [Set-Wallpaper.ps1], InvalidCastException
    • FullyQualifiedErrorId : System.InvalidCastException,Set-Wallpaper.ps1

但是,當我打電話完全相同的命令腳本和參數,第二次它的工作原理。

這是第一次導致我的批處理文件失敗的失敗。

任何更有經驗的人都會對第一次失敗的原因有一些建議,但第二次工作?任何關於如何讓它第一次運作的建議?

回答

7

看,隨着$WP = add-type @"開始行。那就是問題所在。您創建兩種類型:

$wp 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Style         System.Enum 
True  False Setter         System.Object 

嘗試調用Add-Type沒有-Passthru,之後分配到$wp

Add-Type -typedef @" 
... 
"@ 
$WP = [Wallpaper.Setter] 
+0

謝謝stej,那修好了 – Span 2011-05-27 06:50:48

0

裏面PowerShell腳本:

PS c:\> & 'C:\scripts\Set-Wallpaper.ps1' C:\Users\myProfile\Pictures\MyWallpaper.jpg 

從cmd.exe的

C:\> PowerShell -command "& 'C:\scripts\Set-Wallpaper.ps1' C:\Users\myProfile\Pictures\MyWallpaper.jpg" 
+0

感謝您的建議JPBlanc,但這是行不通的。我仍然得到同樣的行爲 - 第一次失敗並且第二次工作。 – Span 2011-05-27 06:44:32

5

我相信這是因爲,中繼正在$ WP到一個數組中 - 你可以試試這個嘗試這個代替:

try { 
    $WP = [Wallpaper.Setter] 
} catch { 
    add-type @" 
.... 
"@ 
    $WP = [Wallpaper.Setter] 
} 

您可以通過線運行它線和檢查tyoe看到:

PS D:\bin\OpenSSL-Win32\bin> $WP 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Style         System.Enum 
True  False Setter         System.Object 

PS D:\bin\OpenSSL-Win32\bin> $WP.GetType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Object[]         System.Array 


PS D:\bin\OpenSSL-Win32\bin> $WP = [Wallpaper.Setter] 
PS D:\bin\OpenSSL-Win32\bin> $WP.GetType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
False True  RuntimeType        System.Type 

第二次類型已經存在,因此%WP正確加載。

+0

感謝您的詳細解答。我已經接受了stej的回答,僅僅是因爲他先回答了,但我已經投了兩個票。我很欣賞解釋如何排除故障的額外細節。 – Span 2011-05-27 06:52:47

+0

這很酷,雖然45分鐘比48分鐘早:) – Matt 2011-05-27 07:30:48

相關問題