Сделать 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, которое вы не получаете с одиночными кавычками.