Windows自动获取壁纸


原文链接: Windows自动获取壁纸

1. 聚焦壁纸获取

脚本编写

聚焦所用图片的文件存储是无后缀的,将小于100KB的过滤,大于100KB的拷贝到F:\Picture\Wallpaper\Spotlight\CopyAssets\并添加jpg后缀

foreach($file in (Get-Item "$($env:LOCALAPPDATA)\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets\*"))
{
    if ((Get-Item $file).length -lt 100kb) { continue }
    Copy-Item $file.FullName "F:\Picture\Wallpaper\Spotlight\CopyAssets\$($file.Name).jpg";
}

将添加后缀的文件根据宽度进行分类,其中宽1920的文件拷贝一份到F:\Picture\Wallpaper\Favorites,该路径存放为动态播放壁纸的文件夹,然后再移动到F:\Picture\Wallpaper\Spotlight\Horizontal备份,宽1080的文件移动到F:\Picture\Wallpaper\Spotlight\Vertical备份

foreach($newfile in (Get-Item "F:\Picture\Wallpaper\Spotlight\CopyAssets\*"))
{
    $image = New-Object -comObject WIA.ImageFile;
    $image.LoadFile($newfile.FullName);
    if($image.Width.ToString() -eq "1920"){Copy-Item $newfile.FullName "F:\Picture\Wallpaper\Favorites" -Force;
							       Move-Item $newfile.FullName "F:\Picture\Wallpaper\Spotlight\Horizontal" -Force;
							       }
    elseif($image.Width.ToString() -eq "1080"){ Move-Item $newfile.FullName "F:\Picture\Wallpaper\Spotlight\Vertical" -Force; }
}

Remove-Item "F:\Picture\Wallpaper\Spotlight\CopyAssets\*";

将上述内容一并保存后缀为.ps1的powershell脚本

powershell权限修改

由于windows10默认的任务计划没有权限执行ps1脚本,因此首先需要用管理员运行Windows PowerShell,然后输入

Set-ExecutionPolicy Unrestricted

进行权限更改,输入Y确认

本次修改后,不用再次修改powershell执行权限

计划任务创建

  • 配置位置:控制面板 -> 系统和安全性-> 管理工具-> 任务计划程序
  • 常规:
    • 名称:例如GetWallPaper
    • 描述:可选
    • 安全选项:
    • 更改用户或组:输入system,这样运行的任务会后台运行,不会有弹窗
    • 勾选使用最高权限运行
    • 配置:这里选择Windows 10
  • 触发器:
    • 新建一个触发器,例如每隔一天或者每隔几小时
  • 操作:
    • 操作:启动程序
    • 程序或者脚本:powershell
    • 可选参数:powershell脚本的绝对路径,例如D:\Users\xxxx\Documents\PowerShell\wallpaper_get.ps1

这样Windows就可以自动获取聚焦的图片


2. 必应壁纸获取

脚本编写

function Save-BingTodayImage()
{
    #必应图片故事API
    $bingImageApi ='http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=zh-cn'
    $bingUri = 'http://www.bing.com/'
 
    # 获取图片链接
    [xml]$bingImageXml = (Invoke-WebRequest -Uri $bingImageApi).Content
    Write-Host "Story: $( $bingImageXml.images.image.copyright ) " 

    $imgLink = '{0}{1}' -f $bingUri , $bingImageXml.images.image.url
    
    # 下载和保存图片
    $imageDir = "F:\Picture\Wallpaper\Bing\"
    if( -not (Test-Path $imageDir) )
    {
        mkdir $imageDir | Out-Null
    }
    $imageFile = Join-Path $imageDir ( '{0}.jpg' -f $bingImageXml.images.image.fullstartdate)
    
    Invoke-WebRequest -Uri $imgLink -OutFile $imageFile
	Copy-Item $imageFile "F:\Picture\Wallpaper\Favorites" -Force;
	
	$imageStoryDir = "F:\Picture\Wallpaper\Bing\Story"
	if( -not (Test-Path $imageStoryDir) )
    {
        mkdir $imageStoryDir | Out-Null
    }
	$date = $(Get-Date).ToString('yyyy-MM-dd');
    echo "Story of $date $( $bingImageXml.images.image.copyright )" >> "$imageStoryDir\timeline.txt"
	
    return $imageFile
}

# 获取今日必应背景图片
$image=Save-BingTodayImage

计划任务创建

类似聚焦壁纸获取->计划任务创建


3. 壁纸归档

壁纸常年累积,难免会堆积过多,为了能看到更多不同壁纸,可以按年月对壁纸进行归档

foreach($file in (Get-Item "F:\Picture\Wallpaper\Favorites\*"))
{
   #获取每个文件的创建时间
    if ((Get-Item $file).lastwritetime -lt $(Get-Date).ToString('yyyy-MM')) { 
    	     #获取时间中的年月,格式例如2017-01
		$folder = $file.lastwritetime.ToString('yyyy-MM');
   		   #获取时间中的年,格式例如2017
		$year = $file.lastwritetime.ToString('yyyy');
		#检测以该文件创建时间的年份命名的文件夹是否存在,例如2017,如果存在
		if((Test-Path "F:\Picture\Wallpaper\History\$year")){
		         #检测该目录下,检测以该文件创建时间的年月命令的文件夹是否存在,例如2017-01,存在将文件移动到该文件夹下
			if((Test-Path "F:\Picture\Wallpaper\History\$year\$folder")) {
				Move-Item $file.FullName "F:\Picture\Wallpaper\History\$year\$folder" -Force;
			}
			#不存以该文件创建时间的年月命名的文件夹,先创建,再将文件移动到该文件夹下
			else {
				New-Item "F:\Picture\Wallpaper\History\$year\$folder" -ItemType directory -Force;
				Move-Item $file.FullName "F:\Picture\Wallpaper\History\$year\$folder" -Force;
			}
		}
		#如果不存在以该文件创建时间的年命名的文件夹
		else {
			#创建以该文件创建时间的年份命名的文件夹
			New-Item "F:\Picture\Wallpaper\History\$year" -ItemType directory -Force;
			#检测该目录下,检测以该文件创建时间的年月命令的文件夹是否存在,例如2017-01,存在将文件移动到该文件夹下
			if((Test-Path "F:\Picture\Wallpaper\History\$year\$folder")) {
				Move-Item $file.FullName "F:\Picture\Wallpaper\History\$year\$folder" -Force;
			}
			#不存以该文件创建时间的年月命名的文件夹,先创建,再将文件移动到该文件夹下
			else {
				New-Item "F:\Picture\Wallpaper\History\$year\$folder" -ItemType directory -Force;
				Move-Item $file.FullName "F:\Picture\Wallpaper\History\$year\$folder" -Force;
			}		
		}

	}
}

4. 参考

`