判断.net环境远程下载安装脚本

正常情况,没有判断.net环境

; 该脚本使用 HM VNISEdit 脚本编辑器向导产生
 ; 安装程序初始定义常量
 !define PRODUCT_NAME "管理系统"
 !define PRODUCT_VERSION "1.0"
 !define PRODUCT_PUBLISHER "信息科技有限公司"
 !define PRODUCT_WEB_SITE "http://www.yhxs3344.net"
 !define PRODUCT_DIR_REGKEY "SoftwareMicrosoftWindowsCurrentVersionApp Paths可执行文件.exe"
 !define PRODUCT_UNINST_KEY "SoftwareMicrosoftWindowsCurrentVersionUninstall${PRODUCT_NAME}"
 !define PRODUCT_UNINST_ROOT_KEY "HKLM"
 SetCompressor lzma
 ; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------
 !include "MUI.nsh"
 !include "nsDialogs.nsh"
 ; MUI 预定义常量
 !define MUI_ABORTWARNING
 !define MUI_ICON "C:本地路径安装install.ico"
 !define MUI_UNICON "C:本地路径安装uninstall.ico"
 ; 欢迎页面
 !insertmacro MUI_PAGE_WELCOME
 ; 安装目录选择页面
 !insertmacro MUI_PAGE_DIRECTORY
 ; 安装过程页面
 !insertmacro MUI_PAGE_INSTFILES
 ; 安装完成页面
 !define MUI_FINISHPAGE_RUN "$INSTDIR可执行文件.exe"
 !define MUI_FINISHPAGE_SHOWREADME ""
 !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
 !define MUI_FINISHPAGE_SHOWREADME_TEXT "开机启动"
 !define MUI_FINISHPAGE_SHOWREADME_FUNCTION finishpageaction
 ;Page custom PageOtherTask
 !insertmacro MUI_PAGE_FINISH
 ; 安装卸载过程页面
 !insertmacro MUI_UNPAGE_INSTFILES
 ; 安装界面包含的语言设置
 !insertmacro MUI_LANGUAGE "SimpChinese"
 ; 安装预释放文件
 !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
 ; ------ MUI 现代界面定义结束 ------
 Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
 OutFile "setup.exe"
 InstallDir "$PROGRAMFILES公司产品"
 InstallDirRegKey HKLM "${PRODUCT_UNINST_KEY}" "UninstallString"
 ShowInstDetails show
 ShowUnInstDetails show
 BrandingText "信息科技有限公司"
 RequestExecutionLevel admin
 ;RequestExecutionLevel admin #NOTE: You still need to check user rights with UserInfo!
 Section "MainSection" SEC01
 setShellVarContext all
 SetOutPath "$INSTDIR"
 SetOverwrite ifnewer
 CreateDirectory "$SMPROGRAMS公司产品"
 CreateShortCut "$SMPROGRAMS公司产品${PRODUCT_NAME}.lnk" "$INSTDIR可执行文件.exe"
 CreateShortCut "$DESKTOP${PRODUCT_NAME}.lnk" "$INSTDIR可执行文件.exe"
 File "本地文件"
 ;。。。
 ;。。。
 ;。。。
 CreateDirectory "$INSTDIRLog"
 SetOutPath "$INSTDIRLog"
 File "本地文件"
 SectionEnd
 Section -AdditionalIcons
 CreateShortCut "$SMPROGRAMS公司产品Uninstall.lnk" "$INSTDIRuninst.exe"
 SectionEnd
 Section -Post
 WriteUninstaller "$INSTDIRuninst.exe"
 WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR可执行文件.exe"
 WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
 WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIRuninst.exe"
 WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR可执行文件.exe"
 WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
 WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
 WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
 SectionEnd
 /******************************
 * 以下是安装程序的卸载部分 *
 ******************************/
 Section Uninstall
 setShellVarContext all
 Delete "$INSTDIR文件.exe"
 Delete "$INSTDIR文件.exe"
 Delete "$INSTDIR文件.config"
 Delete "$INSTDIR文件.dll"
 Delete "$SMPROGRAMS公司产品Uninstall.lnk"
 Delete "$DESKTOP${PRODUCT_NAME}.lnk"
 Delete "$SMPROGRAMS公司产品${PRODUCT_NAME}.lnk"
 RMDir "$SMPROGRAMS公司产品"
 RMDir "$INSTDIRLog"
 RMDir "$INSTDIR"
 DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
 DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
 DeleteRegKey HKCU "SOFTWAREMicrosoftWindowsCurrentVersionRun产品"
 SetAutoClose true
 SectionEnd
 #-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#
 Function .onInit
 FindProcDLL::FindProc "可执行文件.exe"
 Sleep 500
 Pop $R0
 ${If} $R0 != 0
 KillProcDLL::KillProc "可执行文件.exe"
 ${EndIf}
 FindProcDLL::FindProc "Update.exe"
 Sleep 500
 Pop $R0
 ${If} $R0 != 0
 KillProcDLL::KillProc "Update.exe"
 ${EndIf}
 FunctionEnd
 Function un.onInit
 MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您确实要完全移除 $(^Name) ,及其所有的组件?" IDYES +2
 Abort
 FunctionEnd
 Function un.onUninstSuccess
 HideWindow
 MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从您的计算机移除。"
 FunctionEnd
 Function finishpageaction
 WriteRegStr HKCU "SOFTWAREMicrosoftWindowsCurrentVersionRun" "产品" "$INSTDIR可执行文件.exe"
 FunctionEnd

判断.net环境是否安装

Function GetNetFrameworkVersion
 ;获取.Net Framework版本,支持
 Push $1
 Push $0
 ReadRegDWORD $0 HKLM "SOFTWAREMicrosoftNET Framework SetupNDPv3.5" "Install"
 ReadRegDWORD $1 HKLM "SOFTWAREMicrosoftNET Framework SetupNDPv3.5" "Version"
 StrCmp $1 "" +1 +2
 StrCpy $1 "3.5"
 StrCmp $0 1 KnowNetFrameworkVersion +1
 ReadRegDWORD $0 HKLM "SOFTWAREMicrosoftNET Framework SetupNDPv3.0Setup" "InstallSuccess"
 ReadRegDWORD $1 HKLM "SOFTWAREMicrosoftNET Framework SetupNDPv3.0Setup" "Version"
 StrCmp $1 "" +1 +2
 StrCpy $1 "3.0"
 StrCmp $0 1 KnowNetFrameworkVersion +1
 ReadRegDWORD $0 HKLM "SOFTWAREMicrosoftNET Framework SetupNDPv2.0.50727" "Install"
 ReadRegDWORD $1 HKLM "SOFTWAREMicrosoftNET Framework SetupNDPv2.0.50727" "Version"
 StrCmp $1 "" +1 +2
 StrCpy $1 "2.0.50727.832"
 StrCmp $0 1 KnowNetFrameworkVersion +1
 ReadRegDWORD $0 HKLM "SOFTWAREMicrosoftNET Framework SetupNDPv1.1.4322" "Install"
 ReadRegDWORD $1 HKLM "SOFTWAREMicrosoftNET Framework SetupNDPv1.1.4322" "Version"
 StrCmp $1 "" +1 +2
 StrCpy $1 "1.1.4322.573"
 StrCmp $0 1 KnowNetFrameworkVersion +1
 ReadRegDWORD $0 HKLM "SOFTWAREMicrosoft.NETFrameworkpolicyv1.0" "Install"
 ReadRegDWORD $1 HKLM "SOFTWAREMicrosoft.NETFrameworkpolicyv1.0" "Version"
 StrCmp $1 "" +1 +2
 StrCpy $1 "1.0.3705.0"
 StrCmp $0 1 KnowNetFrameworkVersion +1
 StrCpy $1 "not .NetFramework"
 KnowNetFrameworkVersion:
 Pop $0
 Exch $1
 FunctionEnd
 Function CheckFramework4
 ;Clinet 和 Full存在一个都说明安装了Framework
 ClearErrors
 ReadRegDWORD $0 HKLM "SOFTWAREMicrosoftNET Framework SetupNDPv4Client" "Install2"
 IfErrors 0 ExitCheckFramework4
 ClearErrors
 ReadRegDWORD $0 HKLM "SOFTWAREMicrosoftNET Framework SetupNDPv4Full" "Install"
 IfErrors 0 ExitCheckFramework4
 ;没有安装Framework
 MessageBox MB_OK "装程序无法检测到.NET Framework V4,这是必须安装的。安装程序将中止。"
 Abort
 ExitCheckFramework4:
 FunctionEnd

远程下载.NET Framework进行安装

Section -.NET
 Call GetNetFrameworkVersion
 Pop $R1
 ${If} $R1 < '3.5'
 NSISdl::download /TRANSLATE2 '正在下载 %s' '正在连接...' '(剩余 1 秒)' '(剩余 1 分钟)' '(剩余 1 小时)' '(剩余 %u 秒)' '(剩余 %u 分钟)' '(剩余 %u 小时)' '已完成:%skB(%d%%) 大小:%skB 速度:%u.%01ukB/s' /TIMEOUT=7500 /NOIEPROXY 'http://192.168.200.195/dotNetFx40_Full_x86_x64.exe' '$TEMPdotNetFx40_Full_x86_x64.exe'
 Pop $R0
 StrCmp $R0 "success" 0 +3
 ;MessageBox MB_YESNO|MB_ICONQUESTION "dotNetFx40_Full_x86_x64.exe 已成功下载。$r$n是否立即安装?" IDNO +2
 SetDetailsPrint textonly
 DetailPrint "正在安装 .NET Framework ..."
 SetDetailsPrint listonly
 ExecWait '$TEMPdotNetFx40_Full_x86_x64.exe /norestart' $R1
 Delete "$TEMPdotNetFx40_Full_x86_x64.exe"
 ${If} $R1 != 0
 MessageBox MB_OK "装程序无法检测到.NET Framework,这是必须安装的。安装程序将中止。"
 ;Abort
 Quit
 ${EndIf}
 ${EndIf}
 SectionEnd

将.NET Framework封装到安装包中

Section -.NET
 Call GetNetFrameworkVersion
 Pop $R1
 ${If} $R1 < '3.5'
 SetDetailsPrint textonly
 DetailPrint "正在安装 .NET Framework ..."
 SetDetailsPrint listonly
 SetOutPath "$TEMP"
 SetOverwrite on
 File "C:。。。。安装dotNetFx40_Full_x86_x64.exe"
 ExecWait '$TEMPdotNetFx40_Full_x86_x64.exe /norestart' $R1
 Delete "$TEMPdotNetFx40_Full_x86_x64.exe"
 ${If} $R1 != 0
 MessageBox MB_OK "装程序无法检测到.NET Framework,这是必须安装的。安装程序将中止。"
 ;Abort
 Quit
 ${EndIf}
 ${EndIf}
 SectionEnd
 CheckDotNetFramework
* Name: CheckDotNetFramework.nsh
* Version: 0.1
* Date: 20110720
*
* Author: Michael Mefford
* Contact info: [email protected]
*
* Description: NSIS header file to check a windows system for a specified .NET
* framework. CheckDotNetFramework.nsh uses the NSIS stack to
* receive and pass values.
*
* Modified from: http://nsis.sourceforge.net/How_to_Detect_any_.NET_Framework
*
* License: Copyright (C) 2011 Michael Mefford
*
* This software is provided ‘as-is’, without any express or implied
* warranty. In no event will the author(s) be held liable for any
* damages arising from the use of this software.
*
* Permission is granted to anyone to use this software for any
* purpose, including commercial applications, and to alter it and
* redistribute it freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented;
* you must not claim that you wrote the original software.
* If you use this software in a product, an acknowledgment in
* the product documentation would be appreciated but is not
* required.
*
* 2. Altered versions must be plainly marked as such,
* and must not be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any
* distribution.
*
* Usage: Push ${DotNetFrameworkVersion}
* Call CheckDotNetFramework
* Exch $R0
* StrCmp $R0 “0” found not_found
*
* Algorithm: …
*
* Input: A .NET Framework version. This must be verbatim, including major,
* minor, and build version – i.e.
*
* 1.1.4322
* 2.0.50727
* 3.0
* 3.5
* 4
* 4.0
* .
* .
* .
* etc.
*
* Output: “0” if the requested .Net Framework version IS FOUND
* “1” if the requested .NET Framework version IS NOT FOUND
*
*/
Function CheckDotNetFramework
/* Exchange $R0 with the top of the stack to get the value passed by caller */
Exch $R0
/* Save other NSIS registers */
Push $R1
Push $R2
Push $R3
/* Zero out $R2 for the indexer */
StrCpy $R3 “0”
loop:
/* Get each sub key under “SOFTWAREMicrosoftNET Framework SetupNDP” */
EnumRegKey $R1 HKLM “SOFTWAREMicrosoftNET Framework SetupNDP” $R3
StrCmp $R1 “” version_not_found /* Requested version is not found */
StrCpy $R2 $R1 “” 1 /* Remove “v” from subkey */
StrCmp $R2 $R0 version_found /* Requested version is found */
IntOp $R3 $R3 + 1 /* Increment registry key index */
Goto loop
/* The requested .Net Framework version WAS NOT FOUND on this system */
version_not_found:
/* Restore the registers saved earlier */
Pop $R3
Pop $R2
Pop $R1
Pop $R0
Push “1” /* Put “1” on the top of the stack for caller to use */
Goto end
/* The requested .Net Framework version WAS FOUND on this system */
version_found:
/* Restore the registers saved earlier */
Pop $R3
Pop $R2
Pop $R1
Pop $R0
Push “0” /* Put “0” on the top of the stack for caller to use */
end:
FunctionEnd

CheckDotNetFramework宏的使用方法:

;检查是否安装了3.5
StrCpy $DotNetFrameworkVersion 3.5
Push $DotNetFrameworkVersion
Call CheckDotNetFramework
Exch $R0
${If} $R0 == “1” ; 没有找到
MessageBox MB_ICONSTOP|MB_OK “程序运行所必需的 Microsoft .NET Framework$DotNetFrameworkVersion 尚未安装,请先安装该组件。” IDYES
abort
${ElseIf} $R0 == “0” ; 找到指定版本的DotNetFramework
;检查是否安装了4.0
pop $DotNetFrameworkVersion
StrCpy $DotNetFrameworkVersion 4.0
Push $DotNetFrameworkVersion
Call CheckDotNetFramework
Exch $R0
${If} $R0 == “1”
MessageBox MB_ICONSTOP|MB_OK “程序运行所必需的 Microsoft .NET Framework$DotNetFrameworkVersion 尚未安装,请先安装该组件。” IDYES
abort
${EndIf}
${Endif}
GetNetFrameworkVersion

Function GetNetFrameworkVersion
;获取.Net Framework版本支持
Push $1
Push $0
ReadRegDWORD $0 HKLM “SOFTWAREMicrosoftNET Framework SetupNDPv4Full” “Install”
ReadRegDWORD $1 HKLM “SOFTWAREMicrosoftNET Framework SetupNDPv4Full” “Version”
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM “SOFTWAREMicrosoftNET Framework SetupNDPv3.5” “Install”
ReadRegDWORD $1 HKLM “SOFTWAREMicrosoftNET Framework SetupNDPv3.5” “Version”
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM “SOFTWAREMicrosoftNET Framework SetupNDPv3.0Setup” “InstallSuccess”
ReadRegDWORD $1 HKLM “SOFTWAREMicrosoftNET Framework SetupNDPv3.0Setup” “Version”
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM “SOFTWAREMicrosoftNET Framework SetupNDPv2.0.50727” “Install”
ReadRegDWORD $1 HKLM “SOFTWAREMicrosoftNET Framework SetupNDPv2.0.50727” “Version”
StrCmp $1 “” +1 +2
StrCpy $1 “2.0.50727.832”
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM “SOFTWAREMicrosoftNET Framework SetupNDPv1.1.4322” “Install”
ReadRegDWORD $1 HKLM “SOFTWAREMicrosoftNET Framework SetupNDPv1.1.4322” “Version”
StrCmp $1 “” +1 +2
StrCpy $1 “1.1.4322.573”
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM “SOFTWAREMicrosoft.NETFrameworkpolicyv1.0” “Install”
ReadRegDWORD $1 HKLM “SOFTWAREMicrosoft.NETFrameworkpolicyv1.0” “Version”
StrCmp $1 “” +1 +2
StrCpy $1 “1.0.3705.0”
StrCmp $0 1 KnowNetFrameworkVersion +1
StrCpy $1 “not .NetFramework”
KnowNetFrameworkVersion:
Pop $0
Exch $1
FunctionEnd

GetNetFrameworkVersion的使用方法

Call GetNetFrameworkVersion
Pop $1
${If} $1 < ‘2.0.50727’
MessageBox MB_OK “正在安装 .NET Framework…”
SetDetailsPrint textonly
DetailPrint “正在安装 .NET Framework…”
SetDetailsPrint listonly
SetOutPath “$TEMP”
SetOverwrite on
;File “NetFx20SP2_x86.exe”
ExecWait ‘$TEMPNetFx20SP2_x86.exe /quiet /norestart’ $R1
Delete “$TEMPNetFx20SP2_x86.exe”
${EndIf}

这种方式不用在脚本中添加函数代码,复用性好,有两个缺点:
1)不能在一个脚本中调用多次进行多个版本的判断;
2)参数中必须传入DOTNETVMAJOR DOTNETVMINOR DOTNETVMINORMINOR,如果想查4或者4.0版本,脚本中会变成4.或者4.0.,
造成找不到,需要改写一下这个脚本,限于目前自己的水平,还改不了。
封装成宏

!macro DotNetSearch DOTNETVMAJOR DOTNETVMINOR DOTNETVMINORMINOR DOTNETLASTFUNCTION DOTNETPATH
Var /GLOBAL DOTNET1
Var /GLOBAL DOTNET2
Var /GLOBAL DOTNET3
Var /GLOBAL DOTNET4
Var /GLOBAL DOTNET5
Var /GLOBAL DOTNET6
Push $DOTNET1
Push $DOTNET2
Push $DOTNET3
Push $DOTNET4
Push $DOTNET5
Push $DOTNET6
StrCpy $DOTNET1 “0”
StrCpy $DOTNET2 “SOFTWAREMicrosoft.NETFramework”
StrCpy $DOTNET3 0
DotNetStartEnum:
EnumRegKey $DOTNET4 HKLM “$DOTNET2policy” $DOTNET3
StrCmp $DOTNET4 “” noDotNet dotNetFound
dotNetFound:
StrCpy $DOTNET5 $DOTNET4 1 0
StrCmp $DOTNET5 “v” +1 goNextDotNet
StrCpy $DOTNET5 $DOTNET4 1 1
IntCmp $DOTNET5 ${DOTNETVMAJOR} +1 goNextDotNet yesDotNetReg
StrCpy $DOTNET5 $DOTNET4 1 3
IntCmp $DOTNET5 ${DOTNETVMINOR} +1 goNextDotNet yesDotNetReg
StrCmp ${DOTNETVMINORMINOR} “” yesDotNetReg yesDotNetReg
;StrCmp ${DOTNETVMINORMINOR} “” yesDotNetReg +1
;Changed this line (otherwise it would not work with my setup!) – Vinz0r
IntCmpU $DOTNET5 ${DOTNETVMINORMINOR} yesDotNetReg goNextDotNet yesDotNetReg
goNextDotNet:
IntOp $DOTNET3 $DOTNET3 + 1
Goto DotNetStartEnum
yesDotNetReg:
EnumRegValue $DOTNET3 HKLM “$DOTNET2policy$DOTNET4” 0
StrCmp $DOTNET3 “” noDotNet
ReadRegStr $DOTNET5 HKLM $DOTNET2 “InstallRoot”
StrCmp $DOTNET5 “” noDotNet
StrCpy $DOTNET5 “$DOTNET5$DOTNET4.$DOTNET3mscorlib.dll”
IfFileExists $DOTNET5 yesDotNet noDotNet
noDotNet:
StrCmp ${DOTNETLASTFUNCTION} “INSTALL_ABORT” +1 nDN2
MessageBox MB_YESNO|MB_ICONQUESTION
“You must have Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR}$nor higher installed. Install now?”
IDYES +2 IDNO +1
Abort
ExecWait ‘${DOTNETPATH}’
Goto DotNetStartEnum
nDN2:
StrCmp ${DOTNETLASTFUNCTION} “INSTALL_NOABORT” +1 nDN3
MessageBox MB_YESNO|MB_ICONQUESTION
“Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed.$nDo so now?”
IDYES +1 IDNO +3
ExecWait ‘${DOTNETPATH}’
Goto DotNetStartEnum
StrCpy $DOTNET1 0
Goto DotNetFinish
nDN3:
StrCmp ${DOTNETLASTFUNCTION} “WARNING” +1 nDN4
MessageBox MB_OK|MB_ICONEXCLAMATION
“Warning:$n$n$t$tMicrosoft .NET Framework version$n$t$t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed!”
IDOK 0
StrCpy $DOTNET1 0
Goto DotNetFinish
nDN4:
StrCmp ${DOTNETLASTFUNCTION} “ABORT” +1 nDN5
MessageBox MB_OK|MB_ICONEXCLAMATION
“Error:$n$n$t$tMicrosoft .NET Framework version$n$t$t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed, aborting!”
IDOK 0
Abort
nDN5:
StrCmp ${DOTNETLASTFUNCTION} “IGNORE” +1 nDN6
StrCpy $DOTNET1 0
Goto DotNetFinish
nDN6:
MessageBox MB_OK
“$(^Name) Setup internal error.$nMacro ‘DotNetSearch’, parameter ‘4’(${DOTNETLASTFUNCTION})invalid.$nValue must be INSTALL_ABORT|INSTALL_NOABORT|WARNING|ABORT|IGNORE$nSorry for the inconvenience.$n$tAborting…”
IDOK 0
Abort
yesDotNet:
StrCpy $DOTNET1 1
DotNetFinish:
Pop $DOTNET6
Pop $DOTNET5
Pop $DOTNET4
Pop $DOTNET3
Pop $DOTNET2
!define ${DOTNETOUTCOME} $DOTNET1
Exch $DOTNET1
!macroend
© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容