欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-27 09:26:51
...

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)报错问题。
遇到问题,记录一下,希望能帮到正好需要的人。