14

我想在 PowerShell 上执行一个 cmd,这个命令使用分号。然后 PowerShell 将其解释为多个命令。如何让 PowerShell 忽略分号并执行我的命令如何独特的命令?

例子:

Invoke-Expression "msbuild /t:Build;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Debug;_PackageTempDir=$TargetFolder $WebProject"

另一个例子:

Invoke-Expression "test`;test2"

第二个示例响应:

The term 'test' is not recognized as the name of a cmdlet, function, script file, or operable program. Check
the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:6
+ teste <<<< ;teste2
    + CategoryInfo          : ObjectNotFound: (teste:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

The term 'test2' is not recognized as the name of a cmdlet, function, script file, or operable program. Chec
k the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:13
+ teste;teste2 <<<<
    + CategoryInfo          : ObjectNotFound: (teste2:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
4

6 回答 6

29

只需在命令行上转义分号:

msbuild /t:Build`;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Debug`;_PackageTempDir=$TargetFolder $WebProject

我一直使用 tf.exe 实用程序执行此操作:

tf.exe status . /r /workspace:WORK`;johndoe

仅供参考,此问题已在 Connect 上获得大量投票。PowerShell v3 使用新的运算符解决了这个问题--%

$env:TargetFolder = $TargetFolder
msbuild $WebProject --% /t:Build;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Debug;_PackageTempDir=%TargetFolder%
于 2012-04-13T04:03:39.117 回答
3

忽略分号的最简单方法是什么?只需使用单引号与双引号!

在 PowerShell 中,您使用的引用类型很重要。双引号将让 PowerShell 进行字符串扩展(因此,如果您有一个变量 $something = someprogram.exe,并运行“$something”,PowerShell 将替换为“someprogram.exe”)。

如果您不需要字符串替换/变量扩展,那么只需使用单引号。PowerShell 将完全按照列出的方式执行单引号字符串。

如果要使用字符串扩展,另一种选择是使用 here-string。这里的字符串就像一个普通的字符串,但是它以 @ 符号开始和结束在它自己的单独行上,如下所示:

$herestring = @"
Do some stuff here, even use a semicolon ;
"@

这是一个两全其美的方案,因为您可以使用您喜欢的字符并让它们工作,但仍然可以获得变量扩展,这是单引号无法获得的。

于 2015-07-08T14:44:52.190 回答
1

尝试使用 Start-Process 运行 MSbuild,然后使用 -Argument 将其余部分作为值传递。

于 2012-04-12T20:47:01.487 回答
1

这是我用来调用带有注释用法和参数的本机 EXE 文件的示例:

# Gen-CACert.ps1
clear-host

$scriptBlock = {.\Makecert -n `"CN=PowerShell Authorite de certification`"  <# Sujet du certificat (conforme à la norme X50 #>`
                           -a sha1                                          <# Algorithme utilisé #>`
                           -eku 1.3.6.1.5.5.7.3.3                           <# Option du certificat (signature de code) #>`
                           -r                                               <# Certificat auto signé #>`
                           <# -ss `"$($args[0])`"                              Dossier de stockage du certificat #>`
                           -ss `"root`"                                     <# Dossier de stockage du certificat #>`
                           -sr localMachine                                 <# Magasin de stockage localmachine ou currentuser (defaut) #>`
                           -sv `"$($args[0]).pvk`"                          <# Nom du fichier contenant la clef privée #>`
                           `"$($args[0]).cer`"}                             <# Nom du fichier certificat #>

$PoshCARoot = "PoshCARoot"
Invoke-Command -ScriptBlock $scriptBlock  -ArgumentList $PoshCARoot
于 2012-04-13T05:59:55.023 回答
0

作为 的替代方法Start-Process,您可以只调用命令,就像使用调用运算符使用 cmd.exe 调用它一样&

& msbuild /t:Build;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Debug;_PackageTempDir=$TargetFolder $WebProject
于 2012-04-13T03:12:29.723 回答
0

您可以使用逗号作为分隔符:

msbuild /t:Build,PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Debug,_PackageTempDir=$TargetFolder $WebProject
于 2020-02-24T09:35:00.563 回答