Go语言 exec.命令get error `exit status 0x80041017`在CMD中运行成功

uinbv5nw  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(128)

Go中的代码

out, err := exec.Command("wmic", "computersystem", "where", "name=\"%computername%\"", "call", "rename", "name", "newname").CombinedOutput()

if err != nil {
    fmt.Println("err: ", err)
    fmt.Println("out: ", string(out))
}

error和output(err:out:是我加的):

err:  exit status 0x80041017
out:  Node - S
ERROR:        
Description = Invalid query

但直接在CMD中运行成功:

wmic computersystem where name="%computername%" rename newname
Executing (\\S\ROOT\CIMV2:Win32_ComputerSystem.Name="S")->rename()
Method execution successful.
Out Parameters:
instance of __PARAMETERS
{
        ReturnValue = 0;
};
62lalag4

62lalag41#

os/exec文档所述:
在Windows上,进程将整个命令行作为单个字符串接收,并自行进行解析。Command使用与使用CommandLineToArgvW的应用程序兼容的算法(这是最常见的方式)将Args组合并引用到命令行字符串中。值得注意的例外是msiexec.exe和cmd.exe(以及所有批处理文件),它们具有不同的取消引用算法。在这些或其他类似情况下,您可以自己使用引号,并在SysProcAttr.CmdLine中提供完整的命令行,而将Args留空。

cmd := exec.Command("wmic")
cmdLine := `computersystem where name="$computername" rename ` + newName
cmd.SysProcAttr = &syscall.SysProcAttr{CmdLine: "/c " + os.ExpandEnv(cmdLine)}
out, err := cmd.CombinedOutput() // Of course Run or Output

相关问题