在SO上也提出了类似的问题,但这与这些问题略有不同。
我正在开发一个Powershell脚本,该脚本动态构建命令并尝试针对TFS执行它。这个命令需要一些参数的引号,无论我尝试什么,我似乎无法弄清楚如何注入它们。我有这段代码:
$files = Get-ChildItem $pathToDefinitions -Filter *.xml
Foreach ($file in $files){
$fileName = $file.fullName
$cmd = "importwitd /collection: $tfsProjectCollectionUrl /p:`"$projectName`" /f:`"$fileName`""
Write-Host $cmd
#iex "`"" + $($cmd) +"`""
& $witadmin "importwitd /collection: $tfsProjectCollectionUrl /p: "\`" $projectName \`"" /f: "\`"$fileName \`"""
}
这是我最近试图逃避报价,但无济于事。在this问题的已接受答案上,有一个指向Microsoft的链接,但该链接似乎已被破坏。此外,我遇到的许多示例都使用常量而不是动态字符串,这显然增加了一定程度的复杂性。有没有办法在powershell中将引号传递给这个命令调用?
答案 0 :(得分:3)
我喜欢克里斯'方法,但逃避船只报价的另一种方法是使用here-string。在PowerShell格式中,它们采用字符串的形式,该字符串以配对引号开头和结尾,并在各自的行上签名,如此。
$hereString = @"
some stuff here, anything goes!
"@
这是一个很棒的解决方案,因为你实际上并不担心逃避任何事情。只需使用适当的符号开始和结束您的字符串,您就可以在其中放置任何内容,它将按照您的喜好精确执行。
$cmd = @"
importwitd /collection: $tfsProjectCollectionUrl /p:"$projectName" /f:"$fileName"
"@
我尝试从您的示例中的$cmd
行中删除看起来像转义字符的内容。如果这有意义,请告诉我。
答案 1 :(得分:3)
另一种方法是使用格式化字符串,例如:
$cmd = 'importwitd /collection: {0} /p:"{1}" /f:"{2}"' -f $tfsProjectCollectionUrl, $projectName, $fileName
这将为您提供所需的字符串。
答案 2 :(得分:1)
在没有真正知道你正在运行的命令的情况下,我认为它会接受这个:
$argumentList = @(
"importwitd"
"/collection:$tfsProjectCollectionUrl"
"/p:""$projectName"""
"/f:""$fileName"""
)
& $witadmin $argumentList
“可以用来逃避”,在你的参数字符串中给你一个文字引号。