程序:重启时强制删除/替换文件的工具
优质
小牛编辑
221浏览
2023-12-01
很简单的东西,绝对小巧绿色。勾选添加计划删除选项后,即使当前可删除/替换文件,也不进行操作,重启时再执行预定操作。
需要 InstallOptionsEx 插件 2.4.4 beta 2
引用PendFileOpt.nsi的内容:
需要 InstallOptionsEx 插件 2.4.4 beta 2
引用PendFileOpt.nsi的内容:
/* 该脚本由 smilefly 制作 需要 InstallOptionsEx 插件 2.4.4 beta 2 (http://nsis.sourceforge.net/InstallOptionsEx) 请用蓝色网际的汉化增强版编译*/ ; 安装程序初始定义常量 !define PRODUCT_NAME "重启时强制文件删除/替换工具" !define PRODUCT_VERSION "2006.04.06" !define PRODUCT_PUBLISHER "smilefly" !define PRODUCT_WEB_SITE "http://smilefly.googlepages.com" Name "${PRODUCT_NAME}" OutFile "PendFileOpt.exe" InstallDir "$TEMP" ShowInstDetails show SetCompressor /SOLID lzma BrandingText "smilefly" SpaceTexts none Caption "$(^NameDA)" SubCaption 1 " " InstallButtonText "确定(O)" ReserveFile "Opt.ini" ; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------ !include "MUI.nsh" !include "UsefulLib.nsh" Var HWND ; MUI 预定义常量 !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\box-uninstall.ico" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\1027.bmp" Page custom SetOpt LeaveOpt ; 安装过程页面 !define MUI_PAGE_HEADER_TEXT "执行中..." !define MUI_PAGE_HEADER_SUBTEXT "正在执行..." !define MUI_INSTFILESPAGE_FINISHHEADER_TEXT "操作完成" !define MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT "已成功完成所有操作" !define MUI_INSTFILESPAGE_ABORTHEADER_TEXT "操作中止" !define MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT "操作已被中止" !insertmacro MUI_PAGE_INSTFILES ; 安装界面包含的语言设置 !insertmacro MUI_LANGUAGE "SimpChinese" Section "MainSection" SEC01 Clearerrors ReadINIStr $3 $R9 "Field 2" "State" ;$3: 原文件 ReadINIStr $5 $R9 "Field 5" "State" ;$5: 备份开关 ;备份 ${If} $5 = 1 IfFileExists "$3.bak" +7 0 CopyFiles /SILENT $3 "$3.bak" IfFileExists "$3.bak" 0 +3 DetailPrint "成功备份到 $3.bak" Goto +2 DetailPrint "备份失败" Goto bakend ${For} $1 0 99 IfFileExists "$3.bak$1" +7 0 CopyFiles /SILENT $3 "$3.bak$1" IfFileExists "$3.bak$1" 0 +3 DetailPrint "成功备份到 $3.bak$1" Goto +2 DetailPrint "备份失败" ${ExitFor} ${Next} StrCmp $1 100 0 +2 DetailPrint "出错" ${EndIf} bakend: ReadINIStr $R4 $R9 "Field 4" "State" ;$R4: 计划删除开关 ReadINIStr $8 "$R9" "Field 6" "State" ;$8: 替换/删除开关 ${If} $8 = 1 ;替换 ReadINIStr $4 $R9 "Field 8" "State" ;$4: 目标文件 ${For} $1 0 99 ClearErrors IfFileExists "$3$1" +11 0 CopyFiles /SILENT $4 "$3$1" ${If} $R4 = 1 Rename /REBOOTOK "$3$1" "$3" ${Else} Delete $3 Rename "$3$1" "$3" IfErrors 0 +2 Rename /REBOOTOK "$3$1" "$3" ${EndIf} ${ExitFor} ${Next} StrCmp $1 100 0 +2 DetailPrint "出错" IfRebootFlag 0 +3 DetailPrint "无法立即将 $3 替换为 $4, 将在重启后执行替换" Goto +2 DetailPrint "成功将 $3 替换为 $4" ${Else} ;删除 ${If} $R4 = 1 FileOpen $R3 $3 r Delete /REBOOTOK "$3" FileClose $R3 ${Else} Delete /REBOOTOK "$3" ${EndIf} IfRebootFlag 0 +3 DetailPrint "无法立即删除 $3, 将在重启后删除" Goto +2 DetailPrint "成功删除 $3" ${EndIf} Delete "$R9" IfRebootFlag 0 +3 MessageBox MB_OK|MB_ICONEXCLAMATION "部分操作将在重启后执行, 请手动重启." DetailPrint "部分操作将在重启后执行, 请手动重启." SectionEnd Function SetOpt !insertmacro MUI_HEADER_TEXT "文件强制删除/替换" "重启时强制文件删除/替换工具" InstallOptionsEx::initdialog /NOUNLOAD $R9 Pop $HWND GetDlgItem $1 $HWND 1206 EnableWindow $1 0 GetDlgItem $1 $HWND 1207 EnableWindow $1 0 GetDlgItem $1 $HWND 1208 EnableWindow $1 0 InstallOptionsEx::show FunctionEnd Function LeaveOpt ReadINIStr $7 "$R9" "Settings" "State" ;$7 控件序号 ReadINIStr $R7 "$R9" "Settings" "Notify" ;$R7:通知类型 StrCmp $7 6 0 next ;是否重启后替换 ReadINIStr $8 "$R9" "Field 6" "State" ${If} $8 = 1 GetDlgItem $1 $HWND 1206 EnableWindow $1 1 GetDlgItem $1 $HWND 1207 EnableWindow $1 1 GetDlgItem $1 $HWND 1208 EnableWindow $1 1 ${Else} GetDlgItem $1 $HWND 1206 EnableWindow $1 0 GetDlgItem $1 $HWND 1207 EnableWindow $1 0 GetDlgItem $1 $HWND 1208 EnableWindow $1 0 ${EndIf} Abort next: StrCmp $7 10 0 next2 ;清除按钮 StrCpy $0 0 loop: EnumRegValue $1 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager" $0 StrCmp $1 "PendingFileRenameOperations" done StrCmp $1 "" non0 IntOp $0 $0 + 1 Goto loop done: DeleteRegValue HKLM "SYSTEM\CurrentControlSet\Control\Session Manager" "PendingFileRenameOperations" MessageBox MB_OK "已清除所有重启替换/删除项" Abort non0: MessageBox MB_OK "无重启替换/删除项" Abort next2: StrCmp $R7 "ONNEXT" 0 next1 ;下一步时条件 ReadINIStr $3 "$R9" "Field 2" "State" IfFileExists $3 +3 0 MessageBox MB_OK "请选择一个要删除的文件" Abort ${If} $8 = 1 ReadINIStr $4 "$R9" "Field 8" "State" IfFileExists $4 +3 0 MessageBox MB_OK "请选择用于替换的文件" Abort ${EndIf} Goto ends next1: Abort ends: FunctionEnd Function .onInit InitPluginsDir GetTempFileName $R9 File /oname=$R9 "Opt.ini" FunctionEnd ;-------------------------------- ;Callback !define IDC_ABOUT 1300 !define IDC_LINK 1301 !define IDM_ABOUT 1 Function .onPageCallback ${If} $MSG = ${WM_INITDIALOG} Push $0 Push $1 Push $2 Push $3 ${GetDlgItemRect} $0 $1 $2 $3 $HWNDPARENT ${IDC_CANCEL} IntOp $0 $2 - $0 IntOp $2 $3 - $1 ${CreateButton} "关于(A)" 20 $1 $0 $2 $HWNDPARENT ${IDC_ABOUT} IntOp $3 $0 + 30 IntOp $1 $1 + 3 IntOp $2 $2 - 2 ${CreateLink} $3 $1 130 $2 $HWNDPARENT ${IDC_LINK} ${GetSystemMenu} $0 $HWNDPARENT ${AppendMenu} $0 ${MF_SEPARATOR} 0 0 ${AppendMenu} $0 ${MF_STRING} ${IDM_ABOUT} "关于(A)" Pop $3 Pop $2 Pop $1 Pop $0 ${ElseIf} $MSG = ${WM_COMMAND} ${If} $WPARAM = ${IDC_ABOUT} ${MessageBox2} `${PRODUCT_NAME}$\n版权所有 (C) ${PRODUCT_PUBLISHER}.$\n$\n我的主页:$\n${PRODUCT_WEB_SITE}` `关于` ${MB_OK}|${MB_ICONINFORMATION} ${ElseIf} $WPARAM = ${IDC_LINK} ExecShell open `${PRODUCT_WEB_SITE}` ${EndIf} ${ElseIf} $MSG = ${WM_DRAWITEM} ${DrawLink} `访问 ${PRODUCT_PUBLISHER} 的网站` ${IDC_LINK} $LPARAM ${ElseIf} $MSG = ${WM_SYSCOMMAND} ${If} $WPARAM = ${IDM_ABOUT} ${MessageBox2} `${PRODUCT_NAME}$\n版权所有 (C) ${PRODUCT_PUBLISHER}.$\n$\n我的主页:$\n${PRODUCT_WEB_SITE}` `关于` ${MB_OK}|${MB_ICONINFORMATION} ${EndIf} ${EndIf} FunctionEnd
引用Opt.ini的内容:
; Ini file generated by the HM NIS Edit IO designer. [Settings] NumFields=10 [Field 1] Type=Label Text=要删除的文件: Left=26 Right=82 Top=27 Bottom=35 [Field 2] Type=Text State=选择要删除的文件 Left=85 Right=218 Top=24 Bottom=36 ToolTipIcon=INFO ToolTipTitle=源文件 ToolTipText=选择要删除的文件 ToolTipFlags=BALLOON ToolTipTxtColor=0xCC9966 ToolTipBgColor=0xFFFFFF ToolTipMaxWidth=300 [Field 3] Type=Button NOTIFY=OnClick Flags=Open_FILEREQUEST|FILE_HIDEREADONLY|FILE_MUST_EXIST|FILE_EXPLORER Filter=所有文件(*.*) RefFields=2 Text=浏览(S)... Left=224 Right=274 Top=22 Bottom=38 [Field 4] Type=Checkbox Text=计划删除(H) Left=85 Right=149 Top=44 Bottom=54 ToolTipIcon=INFO ToolTipTitle=计划删除 ToolTipText=勾选此处, 即使文件当前可被删除/替换, 也不执行操作, 重启后执行预定操作. ToolTipFlags=BALLOON ToolTipTxtColor=0xCC9966 ToolTipBgColor=0xFFFFFF ToolTipMaxWidth=300 [Field 5] Type=Checkbox Text=创建备份(B) Left=164 Right=230 Top=44 Bottom=54 ToolTipIcon=INFO ToolTipTitle=创建源文件备份 ToolTipText=勾选此处创建源文件备份. 源文件将被备份为*.bak. 若已存在同名的文件, 则将备份为 *.bak0~*.bak99文件. ToolTipFlags=BALLOON ToolTipTxtColor=0xCC9966 ToolTipBgColor=0xFFFFFF ToolTipMaxWidth=300 [Field 6] Type=Checkbox NOTIFY=OnClick Text=文件替换(R) Left=26 Right=91 Top=64 Bottom=73 ToolTipIcon=INFO ToolTipTitle=替换文件 ToolTipText=勾选此处用目标文件替换源文件. ToolTipFlags=BALLOON ToolTipTxtColor=0xCC9966 ToolTipBgColor=0xFFFFFF ToolTipMaxWidth=300 [Field 7] Type=Label Text=用此文件替换: Left=26 Right=82 Top=86 Bottom=94 [Field 8] Type=Text State=选择用于替换的文件 Left=85 Right=218 Top=83 Bottom=96 ToolTipIcon=INFO ToolTipTitle=目标文件 ToolTipText=选择用于替换的文件 ToolTipFlags=BALLOON ToolTipTxtColor=0xCC9966 ToolTipBgColor=0xFFFFFF ToolTipMaxWidth=300 [Field 9] Type=Button NOTIFY=OnClick Flags=Open_FILEREQUEST|FILE_HIDEREADONLY|FILE_MUST_EXIST Filter=所有文件(*.*) RefFields=8 Text=浏览(T)... Left=224 Right=274 Top=81 Bottom=97 [Field 10] Type=Button NOTIFY=OnClick Text="清除重启时删除 / 替换项(U)" Left=120 Right=184 Top=108 Bottom=137