Сделать PowerShell игнорировать точку с запятой

Я хочу выполнить cmd на PowerShell, и эта команда использует точки с запятой. Затем 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

Ответ 1

В качестве альтернативы Start-Process вы можете просто вызвать команду, как вы бы это вызвали, используя cmd.exe, используя оператор вызова &:

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

Ответ 2

Просто выделите точку с запятой в командной строке:

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

Я делаю это все время с помощью утилиты tf.exe:

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

FYI, этот вопрос был сильно проголосован за подключение. PowerShell v3 решает эту проблему с помощью нового оператора --%:

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

Ответ 3

Попробуйте использовать Start-Process для запуска MSbuild, а затем передайте остальное как значение с помощью -Argument.

Ответ 4

Вот пример того, как я могу использовать собственные 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

Самый простой способ игнорировать точку с запятой? Просто используйте одиночную цитату или двойную цитату!

В PowerShell тип цитирования, который вы используете, имеет значение. Двойная кавычка позволит PowerShell расширять строку (поэтому, если у вас есть переменная $something = someprogram.exe и запускается "$ something", PowerShell заменяет "someprogram.exe" ).

Если вам не нужна строковая подстановка/расширение переменной, просто используйте одиночные кавычки. PowerShell будет выполнять строки с одним кадром точно так, как указано.

Другой вариант, если вы хотите использовать расширение строки, - это вместо этого использовать здесь-string. Строка здесь похожа на обычную строку, однако она начинается и заканчивается знаком @на отдельной отдельной строке, например:

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

Это сценарий "лучший из обоих миров", так как вы можете использовать свои модные символы и заставить их работать, но все равно получите расширение Variable, которое вы не получаете с одиночными кавычками.