我使用 WinRAR 的 SFX 模块(除其他外,还有安装选项Run after extraction
)创建应用程序的自定义便携版本。在有 32 位/x86 和 64 位/x64 版本可用的情况下,我init.bat
根据执行环境动态选择要运行哪个版本。
出于 Cyber Essentials Plus 合规性原因,组策略配置为将文件扩展名.bat
与记事本关联,以便无法直接执行它们。这对安全性有好处,但破坏了我的便携式应用程序,所以我需要批量编辑 EXE 文件的注释/SFX 脚本,将其替换init.bat
为cmd.exe /k init.bat
。
经过大量谷歌搜索后,我所找到的只有:
- Windows 文件“注释”属性没有答案。
- PowerShell 命令行似乎
Get-ItemProperty
没有得到评论。 - https://www.tenforums.com/general-support/66937-adding-comments-files-files-explorer-windows-10-a.html#post842655但文件元似乎不起作用——导出的 XML 文件始终只包含
<Metadata/>
。 - 如何编辑文件夹的(元数据)“评论”字段?但那是针对文件夹,而不是文件。
- https://answers.microsoft.com/en-us/windows/forum/all/trying-to-add-comments-to-files-in-windows/8a4e2c4b-8712-47bb-8648-0a6dcddab864?page=3没有真正的答案。
在现代版本的 Windows 中似乎无法真正编辑文件注释。
答案1
因此,我读了https://ss64.com/bash/rar.html和http://acritum.com/winrar/console-rar-manual然后创建了以下 PowerShell 脚本,该脚本执行了我想要的操作:
$RARFile_Path = "C:\Program Files\WinRAR\Rar.exe";
$EXEFiles = Get-ChildItem -Path "<folder path>" -Filter *.exe -Recurse -File;
$SFXSetup_Original = "Setup=init.bat";
$SFXSetup_New = "Setup=cmd.exe /k init.bat";
ForEach ($EXEFile in $EXEFiles){
$EXEFile_Path = $EXEFile.FullName;
$EXEFile_Name = $EXEFile.Name;
$EXEFile_Comment = & $RARFile_Path cw $EXEFile_Path -inul;
If ($EXEFile_Comment -And $EXEFile_Comment -Like $SFXSetup_Original){
<#
Write-Output "Comment, before:";
Write-Output $EXEFile_Comment;
Write-Output "";
#>
$CommentFile_Original_Path = $Env:TMP + "\" + $EXEFile_Name + " comment (original).txt";
If (Test-Path -Path $CommentFile_Original_Path){
Remove-Item -Path $CommentFile_Original_Path -Force;
}
& $RARFile_Path cw $EXEFile_Path $CommentFile_Original_Path -inul;
$CommentFile_Original_Content = Get-Content -Path $CommentFile_Original_Path -Raw;
$CommentFile_New_Path = $Env:TMP + "\" + $EXEFile_Name + " comment (new).txt";
$CommentFile_New_Content = $CommentFile_Original_Content -Replace $SFXSetup_Original, $SFXSetup_New;
Set-Content -Path $CommentFile_New_Path -Value $CommentFile_New_Content;
<#
Write-Output "Comment, after:";
Write-Output $CommentFile_New_Content;
#>
& $RARFile_Path c "-z$CommentFile_New_Path" $EXEFile_Path -inul;
<#
Write-Output "";
Write-Output "";
Write-Output "";
#>
}
}