Заставьте 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

5 ответов

Решение

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

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

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

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%

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

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

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

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

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

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

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

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

Вы можете использовать запятую в качестве разделителя:

msbuild /t:Build,PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Debug,_PackageTempDir=$TargetFolder $WebProject
Другие вопросы по тегам