MENU

Bat方式自动切换桌面壁纸

• June 8, 2026 • Read: 4 • 技术阅读设置

可根据时间自动切换壁纸,也可以只切换一次,壁纸来源来自bing
@echo off

title 壁纸

set "WALL_DIR=%APPDATA%\Wall"
if not exist "%WALL_DIR%" mkdir "%WALL_DIR%"

echo ============================================
echo        自动壁纸
echo ============================================
echo.
echo 请设置自动切换间隔(单位:分钟)
echo   0 = 仅切换一次,不自动循环
echo   1 = 每1分钟切换一次
echo   N = 每N分钟切换一次
echo.
set /p "TIME_INTERVAL=请输入间隔时间: "

if "%TIME_INTERVAL%"=="" set "TIME_INTERVAL=0"

REM 初始化计数器和开始时间
set "RUN_COUNT=0"
set "START_TIME=%TIME%"

echo.
echo [设置] 目录: %WALL_DIR%
if "%TIME_INTERVAL%"=="0" (
    echo [设置] 模式: 单次切换
) else (
    echo [设置] 模式: 每 %TIME_INTERVAL% 分钟自动切换
)
echo ============================================

:FETCH
REM 增加运行次数
set /a "RUN_COUNT+=1"

echo.
echo ----------------------------------------
echo [运行信息] 第 %RUN_COUNT% 次切换壁纸
call :CALC_RUNTIME
echo ----------------------------------------
echo.

powershell -ExecutionPolicy Bypass -NoProfile -Command ^
"$url = 'https://api.aiys.net/api/bing4K/?type=1'; ^
try { ^
    Write-Host '[1/3] 正在获取 JSON 数据...' -ForegroundColor Yellow; ^
    $res = Invoke-RestMethod -Uri $url -TimeoutSec 10; ^
    if ($res.code -eq 200) { ^
        $imgUrl = $res.data.url; ^
        $savePath = Join-Path $env:APPDATA 'LumoWall\bing_wallpaper.jpg'; ^
        Write-Host '[2/3] 下载图片: ' $imgUrl -ForegroundColor Cyan; ^
        $wc = New-Object System.Net.WebClient; ^
        $wc.DownloadFile($imgUrl, $savePath); ^
        Write-Host '      下载完成: ' $savePath -ForegroundColor Green; ^
        Write-Host '[3/3] 设置壁纸...' -ForegroundColor Yellow; ^
        Set-ItemProperty -Path 'HKCU:\Control Panel\Desktop' -Name 'WallPaper' -Value $savePath -Force; ^
        Add-Type -TypeDefinition 'using System; using System.Runtime.InteropServices; public class WallpaperChanger { [DllImport(\"user32.dll\", CharSet = CharSet.Auto, SetLastError = true)] public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); }'; ^
        $result = [WallpaperChanger]::SystemParametersInfo(0x0014, 0, $savePath, 0x0003); ^
        if ($result -ne 0) { ^
            Write-Host '      √ 壁纸已刷新成功!' -ForegroundColor Green; ^
        } else { ^
            Write-Host '      ? 刷新可能需要手动刷新桌面' -ForegroundColor Magenta; ^
        } ^
    } else { ^
        Write-Host 'API 返回错误代码: ' $res.code -ForegroundColor Red; ^
    } ^
} catch { ^
    Write-Host '发生严重错误: ' $_.Exception.Message -ForegroundColor DarkRed; ^
}"

if "%TIME_INTERVAL%"=="0" goto END

echo.
echo [等待] %TIME_INTERVAL% 分钟后自动切换下一张...
echo       按 Ctrl+C 可停止自动切换
set /a "WAIT_SEC=%TIME_INTERVAL% * 60"
timeout /t %WAIT_SEC% /nobreak >nul
goto FETCH

:CALC_RUNTIME
REM 计算运行时间
set "CURRENT_TIME=%TIME%"

REM 转换为秒数
call :TIME_TO_SECONDS "%START_TIME%" START_SEC
call :TIME_TO_SECONDS "%CURRENT_TIME%" CURRENT_SEC

REM 计算差值
set /a "ELAPSED_SEC=CURRENT_SEC-START_SEC"

REM 处理跨午夜情况
if %ELAPSED_SEC% LSS 0 set /a "ELAPSED_SEC+=86400"

REM 转换为时分秒
set /a "HOURS=ELAPSED_SEC/3600"
set /a "MINUTES=(ELAPSED_SEC%%3600)/60"
set /a "SECONDS=ELAPSED_SEC%%60"

echo [运行时间] %HOURS% 小时 %MINUTES% 分钟 %SECONDS% 秒
goto :EOF

:TIME_TO_SECONDS
REM 将时间转换为秒数
set "TIME_STR=%~1"

REM 去除前导空格和处理时间格式
for /f "tokens=1-3 delims=:., " %%a in ("%TIME_STR%") do (
    set /a "H=%%a"
    set /a "M=%%b"
    set /a "S=%%c"
)

REM 计算总秒数
set /a "%~2=H*3600+M*60+S"
goto :EOF

:END
echo.
echo ============================================
echo 任务结束!
echo 总共运行 %RUN_COUNT% 次
call :CALC_RUNTIME
echo 如果壁纸未立即变化,请按 F5 刷新桌面或按 Win+D 两次
echo ============================================
pause
Archives QR Code
QR Code for this page
Tipping QR Code