Go语言 为什么mklink /j在手动输入时有效,但在使用exec.Command运行时无效?

k5ifujac  于 2023-10-14  发布在  Go
关注(0)|答案(2)|浏览(137)

如果我在Windows中手动运行以下命令,它会正常运行并创建Junction Directory。

mklink /j "c:\Users\userid\OneDrive - Enterprise 365\backup\C\Users\userid\test" c:\Users\userid\test

但是,如果我用Go编程,使用以下代码,它会返回Local NTFS volumes are required to complete the operation.

mklink := "mklink /j \"c:\\Users\\userid\\OneDrive - Enterprise 365\\backup\\C\\Users\\userid\\test\\\" c:\\Users\\userid\\test"

cmd := exec.Command("cmd", "/c", mklink)
out, err = cmd.CombinedOutput()

我试过几种不同的方法,但总是得到同样的结果。
有什么想法吗?

fv2wmkja

fv2wmkja1#

我可以通过使用PowerShell来让它工作。

mklink := `New-Item -ItemType Junction -Path "c:\\Users\userid\OneDrive - 
Enterprise 365\backup\C\Users\userid\test" -Target c:\\Users\userid\test`

cmd := exec.Command("PowerShell", "-Command", mklink)
out, err = cmd.CombinedOutput()

我假设问题是GoLang发送嵌入式报价的方式-cmd错误地解释了它们。PowerShell似乎更“宽容”。

lbsnaicq

lbsnaicq2#

我注意到Go的版本,你在OneDrive路径中的“test”之后有一个尾随反斜杠。这可能是一个微妙的Windows行为。
另一种可能性-“mklink /j”需要提升的命令提示符。你的Go脚本是在这样的管理模式窗口中运行的吗?

相关问题