Сценарий PowerShell не работает в первый раз, но работает во второй раз

Я нашел сценарий PowerShell , который может изменять обои рабочего стола моего ПК с Windows 7 для файла изображения, путь к которому указан в качестве параметра. Конечным результатом того, что я хочу, является вызов этого сценария пакетным файлом при запуске.

[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: привести объект типа 'System.Object []' для ввода 'System.Type'.

В строке: 1 символ: 29

  • C: \ scripts \ Set-Wallpaper.ps1
  • CategoryInfo: NotSpecified: (:) [Set-Wallpaper.ps1], InvalidCastException
  • FullyQualifiedErrorId: System.InvalidCastException, Set-Wallpaper.ps1

Но когда я вызываю сценарий с той же самой командой и параметром во второй раз, он работает.

Это первый сбой, который вызывает мой командный файл не работает.

У более опытных есть предложения, почему это не удается в первый раз, но работает во второй раз? Есть предложения, как заставить его работать в первый раз?

5
задан Span 27 May 2011 в 04:03
поделиться