英文:
How do you add spaces to exec.command in golang
问题
如何使用exec.command启动带有空格的文件?添加引号似乎不起作用,使用“或%20代替空格也不起作用。
package main
import (
"fmt"
"os/exec"
)
func main() {
StartProcess("C:\\File With Spaces.txt")
}
func StartProcess(Filename string) {
Filename = "\"" + Filename + "\""
cmd := exec.Command("cmd", "/C", "start", Filename)
err := cmd.Start()
if err != nil {
fmt.Println(err)
}
}
希望这对你有帮助!
英文:
How do I use exec.command to start a file with spaces? Adding quotes doesn't seem to work, neither does " or %20 instead of the spaces.
package main
import (
"fmt"
"os/exec"
)
func main() {
StartProcess("C:\\File With Spaces.txt")
}
func StartProcess(Filename string) {
Filename = "\"" + Filename + "\""
cmd := exec.Command("cmd","/C start",Filename)
err := cmd.Start()
if err!=nil{
fmt.Println(err)
}
}
答案1
得分: 1
如果你想在Windows上运行一个可执行文件,你不需要使用命令提示符。你只需要将可执行文件的路径传递给shell,它就会执行。
例如:
func StartProcess(Filename string) {
// Filename = "cmd /C start \"" + Filename + "\""
cmd := exec.Command(Filename)
err := cmd.Start()
if err != nil {
fmt.Println(err)
}
}
StartProcess("C:\\path to executable\\executable.exe")
话虽如此,通常在Windows上使用所有框架启动可执行文件时(包括Go语言),当尝试连接自己的参数时会遇到麻烦。这就是为什么exec.Command
的args
参数是可变参数的原因。所以你的原始代码应该是这样的:
cmd := exec.Command("cmd", "/C", "start", Filename)
// ^^^^^^^^^^^^^^^ 可变参数使Windows正常工作
英文:
If you're trying to run an executable on Windows then you don't need command prompt. You just need to pass in the executable path to the shell and it will fire.
E.g:
func StartProcess(Filename string) {
// Filename = "cmd /C start \"" + Filename + "\""
cmd := exec.Command(Filename)
err := cmd.Start()
if err!=nil{
fmt.Println(err)
}
}
StartProcess("C:\\path to executable\\executable.exe")
That said, generally with all frameworks on Windows that start executables (Go appears to be included in this) you get in trouble when trying to concatenate your own arguments. That is why the args
argument for exec.Command
is variadic. So your original should have been this:
cmd := exec.Command("cmd", "/C", "start", Filename)
// ^^^^^^^^^^^^^^^ variadic arguments make Windows happy
答案2
得分: 1
这段代码可以在Windows系统中运行:
cmd := exec.Command("rundll32.exe", "url.dll,FileProtocolHandler", Filename)
请注意,这是一段Go语言代码,用于在Windows系统中打开指定的文件。
英文:
This works, but only in windows
cmd := exec.Command("rundll32.exe", "url.dll,FileProtocolHandler", Filename)
答案3
得分: 0
你需要使用cmd.Wait
来等待命令执行完成,并检查方法返回的任何错误。
package main
import (
"bytes"
"log"
"os"
"os/exec"
)
func main() {
args := os.Args
cmd := exec.Command(args[1], args[2:]...)
var b bytes.Buffer
cmd.Stdout = &b
err := cmd.Start()
if err != nil {
log.Fatal(err)
}
if err := cmd.Wait(); err != nil {
log.Fatal(err)
}
if _, err := os.Stdout.Write(b.Bytes()); err != nil {
log.Fatal(err)
}
}
请注意,这是一个Go语言的代码示例,用于执行命令并等待其完成。在执行命令之前,你需要将命令行参数传递给os.Args
,然后使用exec.Command
创建一个命令对象。通过设置cmd.Stdout
来捕获命令的输出,并使用cmd.Start
启动命令。然后,使用cmd.Wait
等待命令执行完成,并检查是否有任何错误发生。最后,将捕获的输出写入标准输出。
英文:
you need to cmd.Wait
and check for any errors returned by your methods
package main
import (
"bytes"
"log"
"os"
"os/exec"
)
func main() {
args := os.Args
cmd := exec.Command(args[1], args[2:]...)
var b bytes.Buffer
cmd.Stdout = &b
err := cmd.Start()
if err != nil {
log.Fatal(err)
}
if err := cmd.Wait(); err != nil {
log.Fatal(err)
}
if _, err := os.Stdout.Write(b.Bytes()); err != nil {
log.Fatal(err)
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论