如何在 PowerShell 中运行带有空格和引号的参数的 EXE 文件

How to run an EXE file in PowerShell with parameters with spaces and quotes

提问人:Vans 提问时间:11/4/2009 最后编辑:Peter MortensenVans 更新时间:12/1/2022 访问量:1154191

问:

如何在 PowerShell 中运行以下命令?

C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql=“Data Source=mysource;集成安全性=false;用户 ID=sa;pwd=sapass!;database=mydb;“ -dest:dbfullsql=”数据源=.\mydestsource;集成安全性=false;用户 ID=sa;pwd=sapass!;数据库=mydb;“,计算机名=10.10.10.10,用户名=administrator,密码=adminpass”

PowerShell 参数 引用 EXE 空格

评论

0赞 Ruben Bartelink 8/3/2012
另请参阅 stackoverflow.com/questions/6224638/...
0赞 user3785010 4/20/2017
如果你的意思是“在 PowerShell 中”(我将其解释为“在现有 PowerShell 提示符中”),那么以下示例可以很容易地满足你的需求。请注意,无需将命令与其参数分开:# Show any available updates to globally installed npm packages using the npm-check-updates tool [string] $cmd = 'ncu -g' Write-Verbose -Message $cmd Invoke-Command -ScriptBlock ([ScriptBlock]::Create($cmd))
0赞 user3785010 4/20/2017
我不知道如何使用“mini-markdown”来编辑上面的评论,使每行代码都出现在单独的一行上,并且编辑原始评论的 5 分钟时间限制已经过期。如果现在有人知道使用“mini-Markdown”来解决这个问题,我会以更易读的形式重新发布。第一行应该如下: # 使用 npm-check-updates 工具显示全局安装的 npm 包的任何可用更新
0赞 John Doe 7/20/2020
我从来不知道评论能够允许不同的行。我认为,Markdown 功能仅限于评论中的链接和 ()[]。backticks
0赞 Fabio says Reinstate Monica 5/5/2023
如何从 shell 运行命令?-> 21 个答案,其中许多需要一页或更多。如果有人问我为什么我认为 Powershell 完全失败的一个原因,这就是答案。

答:

464赞 Keith Hill 11/5/2009 #1

当 PowerShell 看到以字符串开头的命令时,它只会计算字符串,也就是说,它通常会将其回显到屏幕,例如:

PS> "Hello World"
Hello World

如果希望 PowerShell 将字符串解释为命令名称,请使用调用运算符 (&),如下所示:

PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'

之后,您可能只需要引用包含空格和/或引号字符的参数/参数对。当您使用复杂的命令行参数调用此类 EXE 文件时,通常有一个工具可以显示 PowerShell 如何将参数发送到 EXE 文件,这通常非常有帮助。PowerShell 社区扩展具有这样的工具。它被称为 echoargs。您只需将 EXE 文件替换为 echoargs - 保留所有参数,它将显示 EXE 文件将如何接收参数,例如:

PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>

使用 echoargs,您可以进行试验,直到正确为止,例如:

PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>

事实证明,我之前太努力了,无法维护连接字符串周围的双引号。显然这不是必需的,因为即使是 cmd.exe 也会将它们剥离出来。

顺便说一句,向 PowerShell 团队致敬。他们非常有帮助地向我展示了单引号和双引号的具体咒语,以获得所需的结果 - 如果你需要保持内部双引号的位置。:-)他们也意识到这是一个痛苦的领域,但他们受到受特定问题影响的人数的驱使。如果这是你痛苦的领域,那么请投票支持此 PowerShell bug 提交

有关 PowerShell 如何分析的详细信息,请查看我的有效 PowerShell 博客系列 - 特别是第 10 项 - “了解 PowerShell 分析模式”

2012 年 4 月 4 日更新:这种情况在 PowerShell V3 中变得更容易处理。有关详细信息,请参阅此博客文章

评论

1赞 Vans 11/6/2009
如果用作第二个示例,我会收到此错误:错误:无法识别的参数'“-source:dbfullsql=”“”Data'。所有参数必须以“-”开头。
5赞 Tyler Collier 2/12/2011
对不起,我不明白。我看到,目前,有 6 个人对答案投了赞成票,所以我遗漏了一些明显的东西,但实际的答案是什么?是否有特殊规则需要了解带有 PowerShell 空格的参数,或者您只是建议使用 EchoArgs 来提供帮助,具体情况如何?
0赞 Keith Hill 2/12/2011
引用论点通常就足够了,但并非总是如此。在它不起作用的情况下,使用 可以指示 PowerShell 在将参数传递到 EXE 之前如何解释参数。echoargs
1赞 Joe Zim 6/30/2014
你知道我如何在 .bat 文件中执行此操作吗?我直接在控制台中尝试并且它正在工作,但是在批处理文件中,我收到一个错误,说“&此时是意外的”。& 'C:\Program Files\Sublime Text 3\sublime_text.exe'
1赞 Snowcrash 4/8/2020
疯狂。谁想到了呼叫接线员?!我浪费在试图让exe运行上的时间是疯狂的。这是 CrippleShell 独有的功能吗?
83赞 nonolde1er 1/10/2011 #2

只需在 .exe 名称之前添加 & 运算符。 下面是在静默模式下安装 SQL Server Express 的命令:

$fileExe = "T:\SQLEXPRADV_x64_ENU.exe"
$CONFIGURATIONFILE = "T:\ConfSetupSql2008Express.ini"

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE
9赞 G-Mac 1/12/2011 #3

我能够使用以下方法使我的类似命令正常工作:

msdeploy.exe -verb=sync "-source=dbFullSql=Server=THESERVER;Database=myDB;UID=sa;Pwd=saPwd" -dest=dbFullSql=c:\temp\test.sql

对于您的命令(现在没有多大帮助),事情会看起来像这样:

msdeploy.exe -verb=sync "-source=dbfullsql=Server=mysource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;" "-dest=dbfullsql=Server=mydestsource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

关键点是:

  • 在 source 参数两边使用引号,并删除连接字符串两边的嵌入引号
  • 在生成没有空格的 SQL 连接字符串时,请使用备用键名称。例如,使用“UID”而不是“用户 ID”,使用“服务器”而不是“数据源”,使用“Trusted_Connection”而不是“集成安全性”等。我只有在从连接字符串中删除所有空格后才能让它工作。

我没有尝试在命令行末尾添加“computername”部分,但希望此信息能帮助现在阅读本文的其他人更接近他们想要的结果。

评论

2赞 Sentient 2/15/2012
我尝试了所有其他答案,但这是唯一对我有用的答案!感谢您提供这条替代路径。
1赞 Binarus 12/2/2020
一旦命令名称中有空格,这将失败。然后,您必须将命令括在引号中。然后,它将被 Powershell 视为一个字符串,并且只是输出,而不是正在启动的命令,这让我们回到了 OP 的问题。
23赞 Baodad 9/11/2012 #4

请参阅此页面: https://slai.github.io/posts/powershell-and-external-commands-done-right/

使用 vshadow 作为外部可执行文件的摘要:

$exe = "H:\backup\scripts\vshadow.exe"
&$exe -p -script=H:\backup\scripts\vss.cmd E: M: P:
9赞 Loïc MICHEL 12/8/2012 #5

PowerShell V3 中的新转义字符串,引自新的 V3 语言功能

更轻松地重用 cmd 中的命令行.exe

Web 上充满了为 Cmd.exe 编写的命令行。这些命令行在 PowerShell 中经常工作,但是当它们包含某些字符(例如分号 (;)、美元符号 ($) 或大括号)时,必须进行一些更改,可能添加一些引号。这似乎是许多小头痛的根源。

为了帮助解决这种情况,我们添加了一种“转义”命令行解析的新方法。如果您使用魔术参数 --%,我们将停止对命令行的正常解析,并切换到更简单的参数。我们不匹配引号。我们不会止步于分号。我们不会展开 PowerShell 变量。如果您使用 Cmd.exe 语法(例如 %TEMP%),我们会扩展环境变量。除此之外,直到线路末尾(或管道,如果管道)的参数按原样传递。下面是一个示例:

PS> echoargs.exe --% %USERNAME%,this=$something{weird}
Arg 0 is <jason,this=$something{weird}>
50赞 Akira Yamamoto 11/29/2013 #6

这对我有用:

& 'D:\Server\PSTools\PsExec.exe' @('\\1.1.1.1', '-accepteula', '-d', '-i', $id, '-h', '-u', 'domain\user', '-p', 'password', '-w', 'C:\path\to\the\app', 'java', '-jar', 'app.jar')

只需将路径或连接字符串放在一个数组项中,然后将其他内容分别拆分到一个数组项中即可。

这里还有很多其他选择: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx

Microsoft应该使这种方式更简单,并与命令提示符语法兼容。

评论

2赞 Jon Barker 2/8/2019
Array 绝对是最好的选择 - 这对我来说效果很好。除了我传递了一个数组变量,因为我的参数是动态的。谢谢。
0赞 Vasin Yuriy 12/27/2019
恕我直言,最佳解决方案
0赞 David 9/9/2023
这在 Powershell 7 中效果很好,但在 5.1 中则不然
94赞 Microb 3/7/2014 #7

我在命令和参数中都有空格,这对我有用:

$Command = "E:\X64\Xendesktop Setup\XenDesktopServerSetup.exe"
$Parms = "/COMPONENTS CONTROLLER,DESKTOPSTUDIO,DESKTOPDIRECTOR,LICENSESERVER,STOREFRONT /PASSIVE /NOREBOOT /CONFIGURE_FIREWALL /NOSQL"

$Parms = $Parms.Split(" ")
& "$Command" $Parms

这与 Akira 的答案基本相同,但如果您动态构建命令参数并将它们放在变量中,则有效。

评论

2赞 AnneTheAgile 5/21/2015
恕我直言,这是最好的!没有 base64,没有奇怪的 --% 语法切换替换,正常的 powershell 替换规则,没有混淆,可读性很强。
3赞 BrainSlugs83 5/10/2016
这是行不通的。如果您的参数中有路径名,则该路径名将被划分为多个参数。
1赞 Akira Yamamoto 7/7/2017
很好的答案。但是,它适用于参数中的引号吗?
0赞 Jeremy Thompson 5/2/2019
请尝试一下,在其他所有事情都实际起作用之后。还要使用 Powershell 扩展EchoArgs
3赞 CrazyPyro 12/3/2020
这是这个答案的关键部分,使它对我有用.Split(" ")
2赞 Tony Wall 5/27/2014 #8

这对我有用:

PowerShell.exe -Command "& ""C:\Some Script\Path With Spaces.ps1"""

关键似乎是整个命令用外引号括起来,“&”号用于指定正在执行的另一个子命令文件,然后最后在路径/文件名周围转义(双引号)引号,其中包含您首先要执行的空格。

这也是 MS 连接问题的唯一解决方法的完成,即 -File 不会传回非零返回代码,而 -Command 是唯一的替代方法。但直到现在,人们还认为 -Command 的一个局限性是它不支持空格。我也更新了该反馈项。

http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-when-using-the-file-option

评论

3赞 leinad13 7/26/2016
这与操作问题无关,他专门询问了如何在 powershell 中的帖子中运行长命令。不是如何运行文件路径中带有空格的 powershell 脚本。
0赞 Tony Wall 7/28/2016
阅读问题的标题,空格是问题而不是长度。这是此类问题的一个有效答案,因此值得分享。您是否遇到过同样的问题并实际尝试过?如果您想改进它,请提交包含问题中实际命令的编辑,我会接受它。
2赞 Knuckle-Dragger 7/28/2014 #9

另一种答案是使用 Base64 编码的命令开关:

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

解码后,您会看到它是 OP 的原始代码片段,保留了所有参数和双引号。

powershell.exe -EncodedCommand

Accepts a base-64-encoded string version of a command. Use this parameter
to submit commands to Windows PowerShell that require complex quotation
marks or curly braces.

原始命令:

 C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

当编码为 Base64 时,它会变成这样:

QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA==

以下是在家中复制的方法:

$command = 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
$encodedCommand

#  The clip below copies the base64 string to your clipboard for right click and paste.
$encodedCommand | Clip
4赞 Daniel Lidström 2/16/2016 #10

我尝试了所有建议,但仍然无法使用包含空格的参数运行。所以我的解决方案最终使用了:msiexec.exeSystem.Diagnostics.ProcessStartInfo

# can have spaces here, no problems
$settings = @{
  CONNECTION_STRING = "... ..."
  ENTITY_CONTEXT = "... ..."
  URL = "..."
}

$settingsJoined = ($settings.Keys | % { "$_=""$($settings[$_])""" }) -join " "
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.WorkingDirectory = $ScriptDirectory
$pinfo.FileName = "msiexec.exe"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = "/l* install.log /i installer.msi $settingsJoined"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$stdout = $p.StandardOutput.ReadToEnd()
$p.WaitForExit()

评论

0赞 ptr2n0 2/11/2022
等待退出,不要使用 ReadToEnd() 从 StandardOutput 读取。它造成了一个死锁。把它放在方法“WaitForExit()”之前,请参阅:Microsoft Docs - Diagnostic.Process 类
-1赞 Randall Borck 8/9/2017 #11

所以,我遇到了一个类似的问题,并选择这样解决它:

  1. 使用反引号 (') 转义引号 (“) 字符
  2. 用引号 (“) 将新表达式括起来
  3. 使用调用运算符 (&),对新字符串发出命令invoke-expression

解决方案示例:

& { invoke-expression “C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql='”Data Source=mysource;集成安全性=false;用户 ID=sa;pwd=sapass!;Database=mydb;'" -dest:dbfullsql='"Data Source=.\mydestsource;集成安全性=false;用户 ID=sa;pwd=sapass!;数据库=mydb;'“,计算机名称=10.10.10.10,用户名=administrator,密码=adminpass'”“ }

24赞 Darkgaze 2/20/2018 #12

如果有人想知道如何运行可执行文件:

.....> .\file.exe

......> full\path\to\file.exe

评论

5赞 Jean-Daniel Gasser 1/27/2019
这应该是该问题的答案,这就是我们使用“从 PowerShell 启动 EXE”关键字进行搜索时要查找的内容。谢谢!
2赞 SereneWizard 6/27/2019
带着参数运行怎么样?
3赞 Darkgaze 11/14/2019
@SereneWizard 好吧,在.exe后添加它们,中间有一个空格。示例:.\file.exe param1 param2 param3
7赞 Binarus 12/2/2020
一旦命令名称中有空格,这将失败。然后,您必须将命令括在引号中。然后,它将被 Powershell 视为一个字符串,并且只是输出,而不是正在启动的命令,这让我们回到了 OP 的问题。
0赞 BitQuestions 4/30/2021
这个应该被认为是正确的答案。
70赞 Missaka Iddamalgoda 3/7/2018 #13

您可以使用很多方法来做到这一点。

还有其他方法,例如使用调用运算符 (&)、Invoke-Expression cmdlet 等。但它们被认为是不安全的。Microsoft 建议使用 Start-Process

方法 1

一个简单的例子

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root","-proot","-h localhost"

就您而言

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync","-source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","-dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","computername=10.10.10.10","username=administrator","password=adminpass"

在此方法中,使用逗号分隔 ArgumentList 中的每个参数。

方法 2

简单示例

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root -proot -h localhost"

就您而言

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync -source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`" -dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`",computername=10.10.10.10,username=administrator,password=adminpass"

这种方法更容易,因为它允许一次性输入参数。

请注意,在 powershell 中,要表示字符串中的引号 (“ ),您应该插入重音 ( ' )(这是美式键盘中 Tab 键上方的键)。

-NoNewWindow 参数用于在当前控制台窗口中显示新进程。默认情况下,Windows PowerShell 将打开一个新窗口。

参考资料 : Powershell/Scripting/Start-Process

评论

2赞 Mike Casas 6/18/2019
简单总是赢家!谢谢。
0赞 Paolo 1/6/2020
感谢您关于转义引号的最后说明!
5赞 Andy McRae 5/25/2018 #14

可以以不同的方式在 powershell 中运行 exe 文件。例如,如果要运行unrar.exe并提取.rar文件,只需在powershell中编写以下内容:

$extract_path = "C:\Program Files\Containing folder";
$rar_to_extract = "C:\Path_to_arch\file.rar"; #(or.exe if its a big file)  
C:\Path_here\Unrar.exe x -o+ -c- $rar_to_extract $extract_path;

但有时,这不起作用,因此您必须使用 & 参数,如上所示: 例如,使用 vboxmanage.exe(一种管理 virtualbox 虚拟机的工具),您必须像这样调用字符串之外的参数,不带引号:

> $vmname = "misae_unrtes_1234123"; #(name too long, we want to change this)
> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' modifyvm $vmname --name UBUNTU;

如果只想将 winrar 存档文件称为 .exe 文件,还可以使用 invoke-command cmdlet 和 Silent 参数 /S 将其解压缩(它将在与其压缩位置相同的文件夹中提取自身)。

> Invoke-Command -ScriptBlock { C:\Your-path\archivefile.exe /S };

因此,有几种方法可以在 powershell 中运行带有参数的 .exe 文件。

有时,必须找到一种解决方法才能使其正常工作,这可能需要一些进一步的努力和痛苦的:)取决于 .exe 的编译方式或由其创建者制作的方式。

1赞 crokusek 1/5/2019 #15

对于可执行文件名称,可以使用 new-alias cmdlet 来避免处理空格或需要将可执行文件添加到$PATH环境中。

PS> new-alias msdeploy "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
PS> msdeploy ...

要列出或修改 PS 别名,另请参阅

PS> get-alias
PS> set-alias

来自 Jeffery Hicks Aarticle

其他答案解决了这些论点。

7赞 Felix 5/3/2019 #16

我使用这种简单、干净和有效的方法。

我将参数放在一个数组中,每行 1 个。这样就非常容易阅读和编辑。 然后,我使用一个简单的技巧,将双引号内的所有参数传递给具有 1 个单参数的函数。这将它们(包括数组)扁平化为单个字符串,然后我使用 PS 的“Invoke-Expression”执行该字符串。此指令专门用于将字符串转换为可运行的命令。 效果很好:

# function with one argument will flatten 
# all passed-in entries into 1 single string line
Function Execute($command) {
    # execute:
    Invoke-Expression $command;
    # if you have trouble try:
    # Invoke-Expression "& $command";
    # or if you need also output to a variable
    # Invoke-Expression $command | Tee-Object -Variable cmdOutput;
}

#  ... your main code here ...

# The name of your executable app
$app = 'my_app.exe';
# List of arguments:
# Notice the type of quotes - important !
# Those in single quotes are normal strings, like 'Peter'
$args = 'arg1',
        'arg2',
        $some_variable,
        'arg4',
        "arg5='with quotes'",
        'arg6',
        "arg7 \ with \ $other_variable",
        'etc...';
    
# pass all arguments inside double quotes
Execute "$app $args";
  

评论

0赞 public wireless 10/20/2023
将每个参数放入数组中的部分对我有很大帮助!
0赞 drizin 5/18/2019 #17

我的以下代码在我的笔记本电脑上完美运行:

& $msdeploy `
-source:package="$publishFile" `
-dest:auto,computerName="$server",includeAcls="False",UserName="$username",Password="$password",AuthType="$auth" `
-allowUntrusted  `
-verb:sync  `
-enableRule:DoNotDeleteRule `
-disableLink:AppPoolExtension  `
-disableLink:ContentExtension  `
-disableLink:CertificateExtension  `
-skip:objectName=filePath,absolutePath="^(.*Web\.config|.*Environment\.config)$" `
-setParam:name=`"IIS Web Application Name`",value="$appName"

然后,当我尝试直接在一台服务器上运行它时,我开始出现这些错误"Unrecognized argument ...etc.... All arguments must begin with "-". "

在尝试了所有可能的解决方法(没有成功)后,我发现服务器上的 Powershell (Windows 2008 R2) 是 3.0 版,而我的笔记本电脑是 5.0 版。(您可以使用“$PSVersionTable”查看版本)。

将 Powershell 升级到最新版本后,它再次开始工作。

15赞 CyrilDex 8/7/2019 #18

您可以使用:

Start-Process -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

这里要注意的关键是,根据帮助指南,FilePath 必须位于位置 0。要调用 commandlet 的帮助指南,只需键入 。在本例中,它是 .Get-Help <Commandlet-name> -DetailedGet-Help Start-Process -Detailed

3赞 js2010 10/27/2019 #19

Cmd 可以处理运行带引号的 exe,但 Powershell 不能。我只是要处理运行exe本身,因为我没有它。如果您确实需要将双引号发送到外部命令的参数,这是其他地方介绍的另一个问题。

1)将exe文件夹添加到您的路径中,也许在您的$profile

$env:path += ';C:\Program Files\IIS\Microsoft Web Deploy\'
msdeploy

2)反引空格:

C:\Program` Files\IIS\Microsoft` Web` Deploy\msdeploy.exe
-1赞 CBee 8/14/2021 #20

要使用 exiftool.exe 将批处理脚本传输到 powershell 脚本,我面临的挑战是将 '-s、“-s 甚至 ${Filename} 提供给命令,另一方面在这些参数中填写变量。

首先:使用“echochars”的替代非常出色。它清楚地显示了哪些内容被分组为单个参数,哪些内容最终成为下一个参数。

在 powershell 中,它类似于 perl(和 unix 脚本):使用的引号有其含义。

  • “-s.字符串将被解释(变量被填充)
  • '-s 之间的字符串。字符串将不会被解释(或受到限制)
  • 转义字符是 '(反引号)。下一个字符失去了它的特殊含义。可与 unix/linux/perl 上的 \(后冲程)相媲美。

一些例子:

${ExifArgs} += "-if `"`${FileName} !~ /desktop.ini/i`""
${ExifArgs} += '-dateFormat "%Y\%Y%m\%Y%m%d_%H%M%S"'
${ExifArgs} += ('"' + "-FileName<${NewFotos}\${SourceName}\" + '${DateTimeOriginal}_${ImageWidth}x${ImageHeight}_${Model;s/ //g}_${FileName;s/^.*([0-9]{4})[^0-9].*$/\1/}.%e' + '"')

使用上述内容调用 echoargs 会产生下一个输出(为了隐私,号码被黑客入侵):

Arg 11 is <-if>
Arg 12 is <${FileName} !~ /desktop.ini/i>
Arg 13 is <-dateFormat>
Arg 14 is <%Y\%Y%m\%Y%m%d_%H%M%S>
Arg 15 is <-FileName<D:\Pictures\NewFotos\${DateTimeOriginal}_${ImageWidth}x${ImageHeight}_${Model;s/ //g}_${FileName;s/^.*([0-9]{4})[^0-9].*$/\1/}.%e>

查看第一行如何生成参数 11 和 12:删除 outher “-s 以将整行存储在数组中。内部的“-s”,由 '-s 引用是为了将参数保持在一起(而 -if 是前一个参数)

第二个显示了参数 13 和 14:在 '-s 之间使用“-s”。无需使用 '-s 进行转义。

在最后一行(生成参数 15)中:使用 powershell ()-s 和 +-s 将几个字符串连接到单个字符串来构造单个字符串。它使用 “ 和 ' 分隔字符串来让 som ${}-s 由 powershell 填充,一些用于 exiftool。 是的,一些 powershell 特殊字符被转换到拱门中。

1赞 Yotam Omer 10/23/2021 #21

如果您只需要在当前目录中运行一个文件,并且不想拼写出整个路径,请使用 Get-Location

& "$(Get-Location)\example.exe" arg1 arg2 arg3

请注意开头的。间隔的参数应放在引号之后&

评论

1赞 Saj 6/21/2023
对我来说,这个简单的答案让我回到了正轨。其他评分较高的答案似乎适合复杂的编码。
1赞 Yotam Omer 6/24/2023
@Saj很乐意帮助:)