使用PowerShell脚本执行EXE文件

163

我正在尝试使用PowerShell脚本执行一个EXE文件。如果我在命令行中使用它,就没有问题(首先提供可执行文件的名称和一系列参数来调用它):

"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode

但是在脚本中执行完全相同的操作会返回错误:

该项“'C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode' 不被识别为 cmdlet、功能、脚本文件或可操作程序的名称。请检查拼写,或者如果包含路径,请验证路径是否正确并重试。

(我使用“&”运算符调用命令。)

我该如何解决这个问题?


5
请发布您的代码。由于问题就出在代码中,因此查看代码比猜测要容易得多。为了方便理解,请您提供尽可能通俗易懂的表述,但不要改变原意。 - Cody Gray
6个回答

177
& "C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode
或者
[System.Diagnostics.Process]::Start("C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe", "C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode")

更新:抱歉我错过了"(我使用"&"运算符调用命令)"这句话。我在动态评估路径时遇到了这个问题。尝试使用Invoke-Expression结构:

Invoke-Expression "& `"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe`" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode"

有趣的是,原始问题中的命令在我的PS2.0虚拟机上几乎完全可以工作。但是同样的命令现在在PS4.0系统上失败了。有趣的是,我也在调用TestExecute。我认为我最喜欢选项2,我会试一试,谢谢! - EJA

56

看起来你是在一个字符串中同时指定了EXE文件和它的第一个参数,例如:'"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode'。这样是不能工作的。通常情况下,你需要按以下方式调用具有空格路径的本地命令:

& "c:\some path with spaces\foo.exe" <arguments go here>

这里的&需要跟随一个标识命令的字符串,可以是cmdlet、function、本机exe的相对路径或绝对路径。

一旦你只是让它正常工作:

& "c:\some path with spaces\foo.exe"

开始必要的引用参数。虽然看起来你的参数应该没有问题(没有空格,PowerShell不解释其他特殊字符)。


3
可以在PowerShell脚本和可执行文件在同一文件夹中时,使用相对路径来执行脚本吗?或者有没有其他方法可以不使用完整路径来执行脚本? - FarFigNewton
10
如果exe文件在相同的文件夹中,那么你可以这样做:.\foo.exe,你也可以使用相对路径 ..\..\foo.exe、带空格的相对路径 & '..\..\path with spaces\foo.exe' - Keith Hill
当您的命令中有管道时,应使用引号:cmd /c "C:\temp\strarc.exe -cjd:M:\ | C:\temp\strarc.exe -s:8 -xd:N:\" - larkee

5
在PowerShell中,切换到.exe文件所在的目录。例如:
cd C:\Users\Administrators\Downloads
PS C:\Users\Administrators\Downloads> & '.\aaa.exe' 安装程序弹出并按照屏幕上的指示操作。

运行一个 .exe 文件 & '.\aaa.exe' - Sharif Yazdian

3
  1. 克隆$args
  2. 将你的$args推入新数组中
  3. & $path $args

示例:

$exePath = $env:NGINX_HOME + '/nginx.exe'
$myArgs = $args.Clone()

$myArgs += '-p'
$myArgs += $env:NGINX_HOME

& $exepath $myArgs

谢谢 @nodoccat,使用它可以轻松启动一个带有非常长参数列表的Docker命令。 - danidemi

2
这里是一些先前回答的变化。以下任何选项都可以添加到PowerShell配置文件中以满足您的需求。

使用别名

如果您只想运行某些内容而不想搞乱 $env:PATH,则可以使用别名。
Set-Alias -Name docker -Value 'C:\Program Files\Docker\Docker\resources\bin\docker.exe'

使用函数

如果您需要更多的脚本,请使用函数。

function docker {
# below is a basic example - go crazy here
& 'C:\Program Files\Docker\Docker\resources\bin\docker.exe' @Args
}

1

作为非开发人员,我在一行命令中运行了多个ps命令来解决问题。例如:

powershell "& 'c:\path with spaces\to\executable.exe' -arguments ; second command ; etc

通过在 &(和号)之前放置“(双引号),可以执行可执行文件。在我找到的所有示例中都没有提到过这一点。如果没有双引号,ps提示符会打开并等待输入。

嗨,RichardE。你能改善一下你的答案格式吗?在编辑模式下,提供了格式帮助,请看一下。 - Dorian Turba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接