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