PowerShell betiğiyle Windows 7'de bir temayı nasıl değiştirebilirim?


4

Windows 7'nin geçerli temasını değiştirecek bir komut dosyasına sahip olmak istiyorum. Bunun depolandığı kayıt defteri girdisini buldum ancak görünüşe göre Windows'un temayı yüklemesini sağlamak için biraz daha işlem yapmam gerekiyor. Ne yapmalıyım?

İşte kullanmaya çalıştığım komut dosyası, ancak çalışmıyor (kayıt defteri güncellendi, ancak tema değişmedi):

######################################
# Change theme by updating registry. #
######################################

# Define argument which defines which theme to apply. 
param ( [string] $theme = $(Read-Host -prompt "Theme") )

# Define the themes we know about.
$knownThemes = @{ "myTheme" = "mytheme.theme"; "alien" = "oem.theme" }

# Identify paths to user themes.
$userThemes = " C:\Users\yoda\AppData\Local\Microsoft\Windows\"

# Get name of theme file, based on theme provided
$themeFile = $knownThemes["$theme"]

# Build path to theme and set registry.
$newThemePath = "$userThemes$themeFile"
$regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\"
Set-ItemProperty -path $regPath -name CurrentTheme -value $newThemePath

# Update system with this info...this isn't working!
rundll32.exe user32.dll, UpdatePerUserSystemParameters

Yanıtlar:



1

Sorunu bu kodla çözüyorum (Windows 7 64bits'te test edilmiştir)

# definition de la fonction native Windows permettant le test d'activation d'Aero
$def = @"

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern bool DwmIsCompositionEnabled();

"@
# chargement de la fonction native dans un namespace personnel
Add-Type -Namespace MaifCode -Name Aero -MemberDefinition $def


# fonction qui check si Aero est desactive ou non
function Check-Is-Aero{
    [CmdletBinding()]
    param()
    Write-Verbose "[$([DateTime]::Now)] ==> Test de la presence du mode Aero pour la session utilisateur $env:USERNAME"
    if([MaifCode.Aero]::DwmIsCompositionEnabled()){
        Write-Verbose "[$([DateTime]::Now)] ==> Aero actif pour la session utilisateur $env:USERNAME"
        return $true
    }else{
        Write-Verbose "[$([DateTime]::Now)] ==> Aero inactif pour la session utilisateur $env:USERNAME"
        return $false
    }
}

# fonction qui test si Aero est actif et le desactive dans ce cas
function Disable-Aero{
    [CmdletBinding()]
    param()
    # test si aero actif
    If(Check-Is-Aero) {
        Write-Verbose "[$([DateTime]::Now)] ==> Tentative de desactivation du mode Aero pour la session utilisateur $env:USERNAME"
        # desactivation du mode aero en passant sur le them par defaut
        try{
            Start-Process -Wait -FilePath "rundll32.exe" -ArgumentList "$env:SystemRoot\system32\shell32.dll,Control_RunDLL $env:SystemRoot\system32\desk.cpl desk,@Themes /Action:OpenTheme /file:""C:\Windows\Resources\Ease of Access Themes\basic.theme"""
        }
        catch [exception]
        {
            # si erreur alors on sort et on affiche le message d'erreur
            Write-Error "Erreur dans l'execution de la desactivation du mode Aero : $error"
            exit -1
        }
        Write-Verbose "[$([DateTime]::Now)] ==> Desactivation du mode Aero pour la session utilisateur $env:USERNAME terminee"
    }else{
        Write-Verbose "[$([DateTime]::Now)] ==> sortie du script sans action"
    }
}

# execution du code de desactivation
Disable-Aero -Verbose
# on sort
exit 0

1

OP'nin sorusunu doğrudan cevaplamak için aşağıdakileri kullanabilirsiniz. Bu problemi araştırırsanız bulacağınız yakın mekanizma hakkında sonuna doğru bazı yorumlar ekledim, çünkü onların senaryo yazarken onların bir acemi gibi davranmadıklarına inanıyorum.

Ayrıca, teknolojinin durumunu, çözümün saf güç kaynağı (com nesnelerine yapılan çağrılarla da olsa) ve pencereyi kapatmadan önceki gecikmenin, masaüstünün durumuna göre kendini yapılandırması nedeniyle biraz geliştirdim.

#the path to the theme we want to apply
$ThemePath = "C:\Windows\Resources\Ease of Access Themes\classic.theme"

#the name of the desktop customization window (Written for windows 7, change for your flavor)
$CustomizationWindowName = "Personalization"

$myWScriptShell = New-Object -ComObject Wscript.Shell #wscriptshell com object to interact with the system
$myShellApplication = New-Object -ComObject Shell.Application #shellapplication com object to access window names

#execute the theme change
$myWScriptShell.Run("rundll32.exe %SystemRoot%\system32\shell32.dll,Control_RunDLL %SystemRoot%\system32\desk.cpl desk,@Themes /Action:OpenTheme /file:""$ThemePath""")

#this while block continuously searches for the 
#customization window which will be left behind based on it's name
:search while($true) 
{
    #enumerate the open windows
    foreach($window in $myShellApplication.Windows())
    {
        #check each window to see if it's the one of interest
        #when we find the window, break from the outer 
        #"search" loop to execute the remainder of the script
        if($window.LocationName -eq $CustomizationWindowName){break search} 
    }
}

#activate the customization window (in case it's in the background,
#and to be sure we send the keys to the right window)
$myWScriptShell.AppActivate($CustomizationWindowName)

#This is alt+F+C, intended for file->Close. 
#Presumably pulled from another (perhaps office?) script
#In the common literature, this line actually did the close, #the last line was essentially doing nothing
#$myWScriptShell.SendKeys("%FC") #commented as extraneous

#In the common literature, this was just {F4}, which doesn't work without the % for "alt". 
#The prior line actually did the work.
$myWScriptShell.SendKeys("%{F4}") 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.