Powershell 2.0剥离双引号

时间:2016-08-19 19:12:13

标签: powershell

在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中将引号传递给这个命令调用?

3 个答案:

答案 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

“可以用来逃避”,在你的参数字符串中给你一个文字引号。