1

因此,该项目的目标是自动化雨量计皮肤,以从桌面上的 .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%

似乎仍然无法一次提供一个并循环,直到所有项目都被处理并且所有图标文件都被提取和命名。

4

0 回答 0