powershell.exe": executable file not found in %!P(MISSING)ATH%!:(MISSING)出现原因及解决办法

powershell.exe": executable file not found 出现原因及解决办法

有些时候,在开发环境跑得很流畅的程序,一但拿到真实客户环境,就会出现各种各样的问题。我现在就遇到了这类似问题。这个程序是想通过powershell去启动其他程序,也没有什么高深的技术。很快,就开发出来,在测试环境运行,没有任何问题。但是,放到真实客户环境后,就报错:
powershell.exe": executable file not found in %!P(MISSING)ATH%!:(MISSING)
刚开始看到这个错误,我是一脸懵逼。powershell.exe这是系统文件,怎么会找不到呢?于是,我就去windows系统目录下找,在C:\Windows\system32\WindowsPowerShell\v1.0\目录找到了powershell.exe。这就奇怪了,明明文件存在,怎么说找不到了?
我们来看看我的代码是怎么写的(golang):

cmd := exec.Command("PowerShell.exe", temArg...)
err = cmd.Run()

问题就出在exec.Command(“PowerShell.exe”, temArg…)。这里并没有指定powershell的执行路径。我们在看看exec.command的源代码:

func Command(name string, arg ...string) *Cmd {
	cmd := &Cmd{
		Path: name,
		Args: append([]string{name}, arg...),
	}
	if filepath.Base(name) == name {
		if lp, err := LookPath(name); err != nil {
			cmd.lookPathErr = err
		} else {
			cmd.Path = lp
		}
	}
	return cmd
}

源代码显示,如果没有指定执行程序路径,就会在环境变量"path"目录下,去查找可执行文件。
回到我们项目的代码。这里没有指定可执行程序路径,那么就会去环境变量"path"目录下去查找。现在结果是,没有找到(报错:powershell.exe": executable file not found in %!P(MISSING)ATH%!:(MISSING))。那么问题,可能是环境变量"path",没有包含powershell的目录。想到这里,我马上就去报错的那台真实环境上面验证,环境变量path是否包含了"%SYSTEMROOT%\System32\WindowsPowerShell\v1.0"(powershell.exe的文件路径)。果然,没有这条记录,说明就是这个问题引起的。
问题找到了,怎么解决呢?
方案一:在调用 exec.Command()函数时,写出powershell.exe的完整路径。
方案二:在调用 exec.Command()前,我们手动设置环境变量path。给path环境变量,添加"%SYSTEMROOT%\System32\WindowsPowerShell\v1.0"目录.
这里,我采用了方案二。所以,解决该报错的代码如下:

// 设置环境变量,在某些环境下会找不到powershell,这是手动设置一下环境变量
	windir := os.Getenv("windir")
	targetEvn := windir + "\\System32\\WindowsPowerShell\\v1.0\\"
	err := os.Setenv("path", targetEvn)
	if nil != err {
		fmt.Println(err)
		lwlog.Logs.Error(fmt.Sprintf("set env path error:%v", err))
	}
	
	cmd := exec.Command("PowerShell.exe", temArg...)
	err = cmd.Run()
	if nil != err {
		fmt.Println(err)
		lwlog.Logs.Error(fmt.Sprintf("start exe error:%v", err))
		return
	}

这样,就解决powershell.exe": executable file not found in %!P(MISSING)ATH%!:(MISSING)报错问题。
遇到问题,记录一下,希望能帮到正好需要的人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值