Installation 如何检查NSIS中特定端口上运行的进程
我正在使用NSIS为我的应用程序开发一个安装程序。我需要对这个安装程序做的是检查端口80是否可用,如果它可用,请继续安装。如果它不可用,请给出一条错误消息,其中包含在端口80上运行的进程名 我找到了一种检查端口80是否可用的方法。为此,我使用了Ports.nsh作为插件 但是有了它,我就无法在该端口上找到正在运行的进程。我需要给出一个错误消息,例如Installation 如何检查NSIS中特定端口上运行的进程,installation,nsis,port80,Installation,Nsis,Port80,我正在使用NSIS为我的应用程序开发一个安装程序。我需要对这个安装程序做的是检查端口80是否可用,如果它可用,请继续安装。如果它不可用,请给出一条错误消息,其中包含在端口80上运行的进程名 我找到了一种检查端口80是否可用的方法。为此,我使用了Ports.nsh作为插件 但是有了它,我就无法在该端口上找到正在运行的进程。我需要给出一个错误消息,例如 //Skype is running on port 80 and close Skype to continue with the install
//Skype is running on port 80 and close Skype to continue with the installation.
有人能帮我一下吗。谢谢 由于我在nsis中找不到合适的方法来执行此操作,所以我只使用VBScript检查进程名称,并通过nsis脚本调用它。下面是代码 //TestPort80.vbs
Dim WshShell, oExec, key
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("netstat -o -n -a")
key = "0.0:80"
Dim values
values = checkPortStatus(oExec, key)
portInUse = values(0)
input = values(1)
If portInUse Then
x = InStrRev(input, " ")
ProcessID = Mid(input, x+1)
commandTxt = "tasklist /FI " & Chr(34) & "PID eq " & ProcessID & Chr(34)
Dim oExec2, key2
Set oExec2 = WshShell.Exec(commandTxt)
key2 = ProcessID
Dim values2
values2 = checkPortStatus(oExec2, key2)
Found = values2(0)
input2 = values2(1)
If Found Then
y = InStr(input2, " ")
ExeName = Left(input2, y-1)
WScript.StdOut.WriteLine "Port 80 is using by " & ExeName
End If
End If
'## If we explicitly set a Success code then we can avoid this.
WScript.Quit 512
Function checkPortStatus(oExec, key)
portInUse = false
input = ""
Do While True
If Not oExec.StdOut.AtEndOfStream Then
input = oExec.StdOut.ReadLine()
If InStr(input, key) <> 0 Then
' Found Port 80
portInUse = true
Exit DO
End If
Else
Exit DO
End If
WScript.Sleep 100
Loop
Do While oExec.Status <> 1
WScript.Sleep 100
Loop
Dim values(1)
values(0) = portInUse
values(1) = input
checkPortStatus = values
End Function
Dim WshShell, oExec, key
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("netstat -o -n -a")
key = "0.0:80"
Dim values
values = checkPortStatus(oExec, key)
portInUse = values(0)
input = values(1)
If portInUse Then
x = InStrRev(input, " ")
ProcessID = Mid(input, x+1)
commandTxt = "tasklist /FI " & Chr(34) & "PID eq " & ProcessID & Chr(34)
Dim oExec2, key2
Set oExec2 = WshShell.Exec(commandTxt)
key2 = ProcessID
Dim values2
values2 = checkPortStatus(oExec2, key2)
Found = values2(0)
input2 = values2(1)
If Found Then
y = InStr(input2, " ")
ExeName = Left(input2, y-1)
WScript.StdOut.WriteLine "Port 80 is using by " & ExeName
End If
End If
'## If we explicitly set a Success code then we can avoid this.
WScript.Quit 512
Function checkPortStatus(oExec, key)
portInUse = false
input = ""
Do While True
If Not oExec.StdOut.AtEndOfStream Then
input = oExec.StdOut.ReadLine()
If InStr(input, key) <> 0 Then
' Found Port 80
portInUse = true
Exit DO
End If
Else
Exit DO
End If
WScript.Sleep 100
Loop
Do While oExec.Status <> 1
WScript.Sleep 100
Loop
Dim values(1)
values(0) = portInUse
values(1) = input
checkPortStatus = values
End Function
${If} ${TCPPortOpen} 80
GetTempFileName $0
File /oname=$0 `TestPort80.vbs`
nsExec::ExecToStack `"$SYSDIR\CScript.exe" $0 //e:vbscript //B //NOLOGO`
Pop $0
Pop $1
MessageBox MB_OK|MB_ICONSTOP '$1'
Abort
${EndIf}