batch-file - 更改桌面背景的批处理文件仅偶尔或在垃圾邮件打开批处理后有效。我想帮助它立即改变
问题描述
@ECHO on
CD C:\Users\User
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d C:\Users\User\Desktop\folder\Background1.png /f
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v TileWallpaper /t REG_SZ /d 0 /f
RUNDLL32.EXE USER32.DLL, UpdatePerUserSystemParameters 1 True
pause
用户和文件夹名称已默认为可读性
解决方案
可以使用使用 SystemParametersInfo()更新桌面壁纸的批处理 powershell 混合立即完成壁纸更改。
已知支持:.JPG .Bmp 和 .Png
以下脚本用于默认%Userprofile%\pictures
文件夹中的图像 - 修改以满足您的需要。
可以在上面的链接中找到支持样式参数的较新函数
<# : batch portion
:# The above line marks the beginning of a powershell comment block; and the Batch component of the Script. Do not modify.
::# Author: T3RRY ; Creation Date 12/02/2021 ; Version: 1.0.3
::# * Batch Powershell Hybrid * Resource: https://www.dostips.com/forum/viewtopic.php?f=3&t=5543
::# Script Purpose:
::# - Change the wallpaper from command prompt through the use of Parameter; Or by Input if no Parameter.
::# - Script Designed for use with pictures in the %Userprofile%\Pictures Directory
::# or sub directories and should be placed in the %Userprofile%\Pictures Directory.
::# - Hot tip: Add the %Userprofile%\Pictures Directory to your System environment Path variable.
::# https://helpdeskgeek.com/windows-10/add-windows-path-environment-variable/
@Echo off & Mode 120,40
:# Test for Arg 1 ; Usage output ; Offer Input or Abort
Set "Arg1=%~1"
If "%Arg1%" == "" (
Call "%~f0" "/?"
Echo/
Set "Wallpaper="
Set /P "Wallpaper=Press ENTER to abort, or enter filepath / Search Term: "
Setlocal EnableDelayedExpansion
If "!Wallpaper!" == "" Exit /B
Call "%~f0" "!Wallpaper!"
Endlocal
Exit /B
)
:# Test for Unsupported Arg Count ; Notify Ignored Args; Show Help; Offer Abort
Set ParamErr=%*
If Not "%~2" == "" (
Setlocal EnableDelayedExpansion
Echo/Args:"!ParamErr:%Arg1% =!" Ignored. %~n0 only accepts 1 Arg.
Call "%~f0" "/?"
Endlocal
Echo/Continue with Arg1:"%Arg1%" [Y]/[N]?
For /F "Delims=" %%G in ('Choice /N /C:YN')Do if "%%G" == "N" Exit /B
)
:# /Dir Switch - Display all image paths with matching extensions in tree of current Directory
If Not "%Arg1:/Dir=%" == "%Arg1%" (
Dir /B /S "*.jpg" "*.png" "*.bmp" | More
Exit /B
)
:# Usage test and output
If Not "%Arg1:/?=%" == "%Arg1%" (
Echo/ %~n0 Usage:
Echo/
Echo/ %~n0 ["wallpaper filepath" ^| "Search term"]
Echo/ Search times should include wildcard/s: * ? and / or extension as appropriate
Echo/ Example:
Echo/ Search for and select from .jpg files containing Dragon in the filename:
Echo/ %~n0 "*Dragon*.jpg"
Echo/
Echo/ %~n0 [/Dir] - output list of available .jpg .png and .bmp files in the directory tree
Echo/ %~n0 [/?] - help output
Exit /B
)
Set "Wallpaper=%Arg1%"
:# Arg1 Not a valid path; Offer Addition of Wildcards to SearchTerm If not Present as Bookends
If not exist "%Wallpaper%" If not "%Wallpaper:~0,1%" == "*" If not "%Wallpaper:~,-1%" == "*" (
Echo/Add wildcards to "%Wallpaper%" {"*%Wallpaper%*"} [Y]/[N]?
For /F "Delims=" %%G in ('Choice /N /C:YN')Do if "%%G" == "Y" Set "Wallpaper=*%Wallpaper%*"
)
:# To support Search Terms run script in Top level of Directory containing Images; Find Full Path in Tree.
PUSHD "%Userprofile%\Pictures"
Set "Matches=0"
(For /F "Delims=" %%G in ('Dir /B /S "%Wallpaper%"')Do (
Set "Wallpaper=%%~fG"
Set /A Matches+=1
Call Set "Img[%%Matches%%]=%%~fG"
)) 2> Nul
:# Determine if Target Wallpaper is Current Wallpaper; Notify and Exit
reg query "HKEY_Current_User\Control Panel\desktop" -v wallpaper | %__AppDir__%findstr.exe /LIC:"%Wallpaper%" && (
Echo/Wallpaper already applied.
Exit /B
)
:# Enable environment for macro expansion, Arrays and code block variable operations
Setlocal EnableExtensions EnableDelayedExpansion
If NOT %Matches% GTR 1 Goto :Apply
:# Report When Multiple Matches found; Offer menu containing up to first 36 matches [ limit of menu macro ]
If %Matches% GTR 36 Set Matches=36
(Set \n=^^^
%= Newline var \n for multi-line macro definition - Do not modify. =%)
==================================================================
:# Menu macro escaped for Definition with DelayedExpansion Enabled
:# IMPORTANT - RESERVED VARIABLES: Menu CH# CHCS Options Option Opt[i] Option.Output Cholist DIV
:# Key index list Allows 36 menu options. Component of Menu Macro
Set "ChoList=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
:# Get console width for dividing line
for /F "usebackq tokens=2* delims=: " %%W in (`mode con ^| %__APPDIR__%findstr.exe /LIC:"Columns"`) do Set /A "Console_Width=%%W"
:# Build dividing line for menu output.
Set "DIV=" & For /L %%i in (2 1 %Console_Width%)Do Set "DIV=!DIV!-"
:# Menu macro Usage: %Menu% "quoted" "list of" "options"
Set Menu=For %%n in (1 2)Do if %%n==2 (%\n%
%= Output Dividing Line =% Echo(^^!DIV^^!%\n%
%= Reset CH# index value for Opt[#] =% Set "CH#=0"%\n%
%= Undefine choice option key list =% Set "CHCS="%\n%
%= For Each in list; =% For %%G in (^^!Options^^!)Do (%\n%
%= For Option Index value =% For %%i in (^^!CH#^^!)Do (%\n%
%= Build the Choice key list and Opt[#] =% Set "CHCS=^!CHCS^!^!ChoList:~%%i,1^!"%\n%
%= array using the character at the =% Set "Opt[^!ChoList:~%%i,1^!]=%%~G"%\n%
%= current substring index. =% Set "option.output=%%~G"%\n%
%= Display ; removing # variable prefix =% Echo([^^!ChoList:~%%i,1^^!] ^^!Option.output:#=^^!%\n%
%= Increment Opt[#] Index var 'CH#' =% Set /A "CH#+=1"%\n%
%= Close CH# loop =% )%\n%
%= Close Options loop =% )%\n%
%= Output Dividing Line =% Echo(^^!DIV^^!%\n%
%= Select option by character index =% For /F "Delims=" %%o in ('%__APPDIR__%Choice.exe /N /C:^^!CHCS^^!')Do (%\n%
%= Assign return var 'OPTION' with the =% Set "Option=^!Opt[%%o]^!"%\n%
%= value selected from Opt[CH#] array. =% If /I "^!Option^!" == "Exit" Exit /B 2%\n%
%= Return to previous script on Exit =% )%\n%
%= Capture Macro input - Options List =% )Else Set Options=
========================================== ::: End Menu Definition
:# Notify match count
Echo/%Matches% Files Matched:"!Arg1!"
:# Use match count to build options list for Menu macro from IMG[ Array. Restricted to first 36 matches.
Set "Menu.Options="
For /L %%i in (1 1 %Matches%)Do Set "Menu.Options=!Menu.Options! "!Img[%%i]!""
:# Call Menu macro
%Menu% %Menu.Options%
:# Notify selected option
Echo(Wallpaper Selected = !Option!
Set "Wallpaper=%Option%"
:Apply
:# Pipe Filepath to Powershell; Capture as Powershell Variable within Pipe; Exit on Return.
Echo/!Wallpaper!| powershell.exe -noprofile "$Image = $input | ?{$_}; iex (${%~f0} | out-string)"
Endlocal
POPD
Exit /B 0
:# The below line Marks the end of a Powershell comment Block; And the End of the Batch Script.
: end batch / begin powershell #>
<#
Function Source: https://www.joseespitia.com/2017/09/15/set-wallpaper-powershell-function/
#>
Function Set-WallPaper {
[CmdletBinding()]
param (
[Parameter(Mandatory)]
[string]$Image
)
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class Params
{
[DllImport("User32.dll",CharSet=CharSet.Unicode)]
public static extern int SystemParametersInfo (Int32 uAction,
Int32 uParam,
String lpvParam,
Int32 fuWinIni);
}
"@
$SPI_SETDESKWALLPAPER = 0x0014
$UpdateIniFile = 0x01
$SendChangeEvent = 0x02
$RefreshIni = $UpdateIniFile -bor $SendChangeEvent
$ret = [Params]::SystemParametersInfo($SPI_SETDESKWALLPAPER, 0, $Image, $RefreshIni)
}
If (Test-Path $Image) {
Set-WallPaper -Image $Image
write-output "Wallpaper Updated."
}else {
write-output "Wallpaper Does not exist in the Directory Tree."
}