Golang中参数中的Windows命令行附加引号

时间:2014-09-09 03:00:20

标签: go

我想在Windows(使用Go 1.3.1的Windows 8.1)中编写一个批处理助手来使用exiftool.exe。

我在Go中运行命令行的原因是我试图访问从其他Web端检索的一些EXIF信息。我只想写回EXIF图片。

这是我的代码段。

        str_abs, _ := filepath.Abs(target_path)
        str_title := fmt.Sprintf("-title=\"%s\"", ext_str)
        stdout, err := exec.Command("cmd", "/c", "exiftool.exe", str_title, "-E", str_abs).Output()

但是我发现参数中总会有一个额外的引用,所以结果与:

相同
exiftool.exe -title=""TITLE"" -E TARGET_FILE

知道怎么回事吗?或任何关于如何处理这样的参数的建议。

注意:

  • 我将参数和字符串分开的原因再次组合起来,因为命令行需要使用中文字符串等unicode字符串。
  • exiftool.exe仅适用于命令行“&#%d;”在Windows中使用中文字符的代码,所以我为此做了更多处理。
  • 如果我使用非unicode(例如标题显示'1234'不是1234),也会发生错误

        stdout, err := exec.Command("cmd", "/c", "exiftool.exe", "-title", "1234", str_abs).Output()
    
  • 错误代码:运行命令eror:退出状态1.

----- 2014/09/10更新@VonC -------------------------------- -----------------

Hi VonC,

我尝试与您提供的代码做同样的事情,但它对我不起作用。 我对命令行代码页感到好奇,我在477(美国)950(Big5)中尝试过它都不适合我。

我想讨论两件事。

  • 中文字必须改为&#%d;否则会显示错误。
  • 即使我尝试了它,但它仍然显示在我的图片标题中。
  • 我的代码示例如下:

    output, err := exec.Command(`d:\exiftool.exe`,
    `-title="test 2世界"`,
    //If it not trasnfer from 世界 -> 世界  it could not display correctly.
    "-E", "test.jpg").CombinedOutput()
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Println(string(output))
    

2 个答案:

答案 0 :(得分:1)

我刚刚测试过:

output, err := exec.Command(`c:\prgs\exiftool-9.70\exiftool.exe`,
    `-title="test 2 世界"`,
    "-E", "test.jpg").CombinedOutput()
if err != nil {
    fmt.Println(err.Error())
}
fmt.Println(string(output))

它似乎工作得很好。
请注意,如果出现问题,exec.CombinedOutput()只能看到“exit status 1”以外的内容。

第二次调用将调度所有EXIF元数据:

exec.Command(`c:\prgs\exiftool-9.70\exiftool.exe`, "test.jpg").CombinedOutput()

标题是预期的test 2 世界

答案 1 :(得分:1)

fmt.Printf(“%q”,“somestring”)=> “somestring”