gpt4 book ai didi

windows - 从 vbscript 获取 bat 中的错误级别

转载 作者:可可西里 更新时间:2023-11-01 10:46:22 26 4
gpt4 key购买 nike

我正在尝试确定用户是否在 UAC 提示中单击了“否”,如果是则不设置 nul 端口。

我正在调用这个脚本形成一个批处理文件,如果用户单击否,我想退出。

VBScript:

选项显式

Main 

Sub Main

Dim oShell, objWMIService, servSpooler, objReg, objShellApp, result

Const PrinterPort = "NUL:"
Const HKLM = &h80000002

If Not WScript.Arguments.Named.Exists("elevate") Then
Set objShellApp = CreateObject("Shell.Application")
objShellApp.ShellExecute WScript.FullName, WScript.ScriptFullName & " /elevate", "", "runas", 0
WScript.Quit
End If

result = isElevated()

If result = True Then
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
set servSpooler = objWMIService.Get("Win32_Service.Name='spooler'")
Set objReg = GetObject("winmgmts:root\default:StdRegProv")

servSpooler.StopService
objReg.SetStringValue HKLM, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports", PrinterPort, ""
servSpooler.StartService
Else
WScript.Quit 1
End If

End Sub

Function isElevated
Dim shell, whoami, whoamiOutput, strWhoamiOutput

Set shell = CreateObject("WScript.Shell")
Set whoami = shell.Exec("whoami /groups")
Set whoamiOutput = whoami.StdOut
strWhoamiOutput = whoamiOutput.ReadAll

If InStr(1, strWhoamiOutput, "S-1-16-12288", vbTextCompare) Then
isElevated = True
Else
isElevated = False
End If
End Function

批处理:

cscript "set_port.vbs"
IF ERRORLEVEL 1 (
ECHO FAIL
PAUSE
EXIT
)

现在,我查看了这个页面:

http://www.robvanderwoude.com/errorlevel.php

和其他一些人,我觉得我尝试了所有可能的组合。可能,我只是还没有正确的组合。非常感谢一些提示和帮助!

基本目标:确定用户是否在 UAC 提示中单击“否”,然后结束 VBScript 和批处理文件。

更新:

好的,感谢您到目前为止的所有回答。我很确定现在是剧本。我在批处理文件中再次使用错误级别,现在它工作得很好。

至于 VBScript:当用户在 UAC 提示中单击“否”(意味着当前文件未提升)时,为了让错误代码为 1,我需要这样写:

If result = True Then
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
set servSpooler = objWMIService.Get("Win32_Service.Name='spooler'")
Set objReg = GetObject("winmgmts:root\default:StdRegProv")

servSpooler.StopService
objReg.SetStringValue HKLM, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports", PrinterPort, ""
servSpooler.StartService
WScript.Quit(0)
Else
WScript.Quit(1)
End If

但是:在ShellExecute之后的第一个WScript.Quit中,我还需要放入WScript.Quit(1),对吧?因为否则我永远不会将错误传递给错误级别(或至少不大于 0)。

所以:

    objShellApp.ShellExecute WScript.FullName, WScript.ScriptFullName & " /elevate", "", "runas", 0
WScript.Quit(1)

我想,最大的问题是在 UAC 提示符上单击“否”不会导致错误,因此我需要将 WSCript.Quit(1) 放在那里。

或者我反过来说:WScript.Quit(1) 当用户单击 YES 并且脚本被提升并放置 WScript.Quit(0) everyhwere else.

但是,在第一种情况下,我总是得到错误级别 1,而在第二种情况下,我总是得到错误级别 0。

------------ 更新:

我的 VBScript 文件现在看起来像这样:

    Option Explicit

Main

Sub Main

Dim objShell, objWMIService, servSpooler, objReg, objShellApp, result, oShell
Dim whoami, strWhoamiOutput, whoamiOutput

Const PrinterPort = "NUL:"
Const HKLM = &h80000002

If Not WScript.Arguments.Named.Exists("elevate") Then
Set objShellApp = CreateObject("Shell.Application")
objShellApp.ShellExecute WScript.FullName, WScript.ScriptFullName & " /elevate", "", "runas", 0
WScript.Quit 10
WScript.Echo("Done")
Else

Set oShell = CreateObject("WScript.Shell")
Set whoami = oShell.Exec("whoami /groups")
Set whoamiOutput = whoami.StdOut
strWhoamiOutput = whoamiOutput.ReadAll

If InStr(1, strWhoamiOutput, "S-1-16-12288", vbTextCompare) Then
Wscript.Echo("ADMIN")
WScript.Echo("Port")
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
set servSpooler = objWMIService.Get("Win32_Service.Name='spooler'")
Set objReg = GetObject("winmgmts:root\default:StdRegProv")

servSpooler.StopService
objReg.SetStringValue HKLM, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports", PrinterPort, ""
servSpooler.StartService
WScript.Quit 1
End if
WScript.Echo("Done 2")

End If

End Sub

和一个测试批处理:

@echo off
cscript "test.vbs"
ECHO %errorlevel%
PAUSE

错误级别输出是 10 而不是 1,尽管脚本按预期退出并且从未显示消息“完成”。

最佳答案

调试技巧:

编写一个仅设置错误级别并退出的 VBS 脚本 - 并让它与您的批处理脚本一起工作。

然后您可以修改完整的 vbs 脚本。

关于windows - 从 vbscript 获取 bat 中的错误级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23648890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com