Я пытаюсь вызвать appcmd изнутри Go. Приведенный ниже код показывает успех, но установлен неправильный пароль. Если я удалю внутренние кавычки (во второй строке 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