使PowerShell忽略分号

时间:2012-04-12 20:09:20

标签: powershell

我想在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

6 个答案:

答案 0 :(得分:23)

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

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

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

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

仅供参考,issue has been heavily voted up on Connect。 PowerShell v3使用新的--%运算符来解决此问题:

$env:TargetFolder = $TargetFolder
msbuild $WebProject --% /t:Build;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Debug;_PackageTempDir=%TargetFolder%

答案 1 :(得分:2)

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

答案 2 :(得分:2)

作为Start-Process的替代方法,您只需调用该命令,就像使用调用操作符&使用cmd.exe调用它一样:

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

答案 3 :(得分:2)

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

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

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

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

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

这是一个两全其美的场景,因为你可以使用你喜欢的角色并使它们有效,但仍然可以使用单引号获得变量扩展。

答案 4 :(得分: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

答案 5 :(得分:0)

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

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