因此,该项目的目标是自动化雨量计皮肤,以从桌面上的 .url 和 .lnk 文件中提取图标和名称。(这将在以后用于将图标图像显示为桌面覆盖中的可点击快捷方式)。
无论如何,做了一堆研究,卡住了
首先我找到桌面文件夹,它可能在另一个驱动器上,所以......
set "DesktopFolder="
for /F "skip=1 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop 2^>nul') do if /I "%%I" == "Desktop" if not "%%~K" == "" if "%%J" == "REG_SZ" (set "DesktopFolder=%%~K") else if "%%J" == "REG_EXPAND_SZ" call set "DesktopFolder=%%~K"
if not defined DesktopFolder for /F "skip=1 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop 2^>nul') do if /I "%%I" == "Desktop" if not "%%~K" == "" if "%%J" == "REG_SZ" (set "DesktopFolder=%%~K") else if "%%J" == "REG_EXPAND_SZ" call set "DesktopFolder=%%~K"
if not defined DesktopFolder set "DesktopFolder=\"
if "%DesktopFolder:~-1%" == "\" set "DesktopFolder=%DesktopFolder:~0,-1%"
if not defined DesktopFolder set "DesktopFolder=%UserProfile%\Desktop"
这似乎有效。
比我得到该目录中的项目列表
set "LIST="
for %%G in (%DesktopFolder%\*.url, %DesktopFolder%\*.lnk) do set LIST=!LIST! %%~nxG
这似乎也有效。但是当回显到 txt 文件时似乎是一个长字符串。这可能是个问题。
所以也试过
for /F "usebackq tokens=*" %%A in (DirContents.txt) do set LIST=!LIST! %%A
接下来,我需要将该列表输入到其他内容中以提取图标、保存它们并命名它们。
set "exe_in=%LIST%"
set "out_dir=Icons"
set "out_nam=%LIST%"
set "ico_out=%out_dir%\%out_nam%.ico"
set "psCommand1="Remove-Item(\"%ico_out%\")""
set "psCommand2="[void][Reflection.Assembly]::LoadWithPartialName('System.Drawing');^
[Drawing.Icon]::ExtractAssociatedIcon(\"%DesktopFolder%\%exe_in%\").ToBitmap().Save(\"%ico_out%\")""
set "psCommand3="[System.Diagnostics.FileVersionInfo]::GetVersionInfo(\"%DesktopFolder%\%exe_in%\").FileDescription""
powershell -noprofile -noninteractive %psCommand1%
powershell -noprofile -noninteractive %psCommand2%
powershell -noprofile -noninteractive %psCommand3%
似乎仍然无法一次提供一个并循环,直到所有项目都被处理并且所有图标文件都被提取和命名。