【发布时间】:2020-08-07 00:48:02
【问题描述】:
我正在尝试从 Go 中调用 appcmd。下面的代码显示成功,但密码设置错误。如果我删除内部引号(在 main 的第二行)它可以工作,但是当密码包含空格时它就不起作用了!现在加上引号,如果我在 cmd.exe 中输入与输出完全相同的命令,它就可以工作!那是什么鬼!为什么它可以直接在 cmd 中使用引号,而从 Go 调用时却不行?
我真的不想成为那种说你不能在密码中使用空格的人,因为我不知道为什么它不起作用!啊!
package main
import (
"bytes"
"fmt"
"os/exec"
"strconv"
"strings"
"syscall"
)
func main() {
iisPath := "C:\\WINDOWS\\sysWOW64\\inetsrv\\"
callAppcmd(iisPath, "-processModel.password:\"password\"")
}
func callAppcmd(iisPath string, param string) {
stdOut, _, _, exitCode := runCommand(
iisPath+"appcmd.exe",
"set",
"apppool",
"/apppool.name:DefaultAppPool",
param)
printOut(stdOut)
printOut(strconv.Itoa(exitCode))
}
func printOut(text string) {
fmt.Println(text)
}
func runCommand(commands ...string) (string, string, error, int) {
printOut(strings.Join(commands, " "))
cmd := exec.Command(commands[0], commands[1:]...)
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
exitCode := 0
if exitError, ok := err.(*exec.ExitError); ok {
exitCode = exitError.ExitCode()
}
return out.String(), stderr.String(), err, exitCode
}
输出:
C:\WINDOWS\sysWOW64\inetsrv\appcmd.exe set apppool /apppool.name:DefaultAppPool -processModel.password:"password"
APPPOOL object "DefaultAppPool" changed
0
【问题讨论】:
-
调用等效的 PowerShell cmdlet 可能是更好的选择。
-
我不相信 PowerShell 适合我。
-
那为什么其他人可以从 Go 调用 PowerShell? google.com/search?client=firefox-b-d&q=go+powershell
-
我并不是说这不可能,我是说 PowerShell 不适用于该程序。我无法使用它。