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

C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="数据源=mysource;集成安全=false;用户ID=sa;Pwd=sapass!;数据库=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 V3中的新转义字符串,引用自New 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}>

其他回答

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

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

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE

您可以在powershell中以不同的方式运行exe文件。例如,如果你想运行unar .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命令cmdlet和一个Silent参数/S(它将在压缩的文件夹中解压缩自己)来解压缩它。

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

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

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

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

…> \ file.exe。

or

……> \路径\ \ file.exe

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

PS> "Hello World"
Hello World

如果你想让PowerShell将字符串解释为命令名,那么使用调用操作符(&),如下所示:

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

After that you probably only need to quote parameter/argument pairs that contain spaces and/or quotation chars. When you invoke an EXE file like this with complex command line arguments it is usually very helpful to have a tool that will show you how PowerShell sends the arguments to the EXE file. The PowerShell Community Extensions has such a tool. It is called echoargs. You just replace the EXE file with echoargs - leaving all the arguments in place, and it will show you how the EXE file will receive the arguments, for example:

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>

使用回声,你可以不断实验,直到你得到正确的答案,例如:

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错误提交投票。

有关PowerShell如何解析的更多信息,请查看我的Effective PowerShell博客系列——特别是第10项——“理解PowerShell解析模式”

2012年4月4日更新:这种情况在PowerShell V3中更容易处理。详见这篇博客文章。

请看本页: 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: