Visual Studio PreBuildEvent powershell 字符串缺少终止符:“

Visual Studio PreBuildEvent powershell The string is missing the terminator: "

之前我遇到了一个最奇怪的错误,我真的很困惑,所以我想我会写一个自我回答来帮助人们解决问题。我的 googlefu 什么都没找到,所以我们来了。

这是我原来的台词

<PreBuildEvent>powershell.exe -noninteractive -command "$(solutiondir)\..\PreBuild.ps1" "$(TargetFileName)" "$(ProjectDir)" "$(SolutionDir)"</PreBuildEvent>

这是我的 PreBuild.ps1 文件:

Param(
    [Parameter(Mandatory=$false)][string]$targetFileName,
    [Parameter(Mandatory=$false)][string]$projectDir,
    [Parameter(Mandatory=$false)][string]$solutionDir
)
process {
    Write-Host "`$targetFileName $targetFileName";
    Write-Host "`$projectDir $projectDir";
    Write-Host "`$solutionDir $solutionDir";
}

出于某种原因,我的脚本中的变量 $projectDir 包含 projectdir 和 solutiondir。像这样:

2>  Processing files with gulp script.
2>  $targetFileName project.dll
2>  $projectDir c:\src\sln\project c:\src\sln

所以我改成了这个

<PreBuildEvent>powershell.exe -noninteractive -command "$(solutiondir)\..\PreBuild.ps1" "$(TargetFileName)" "$(ProjectDir)"</PreBuildEvent>

我在 VS 输出中收到此错误:The string is missing the terminator: ".

这是我搞砸的地方。 $(ProjectDir) 以斜杠结尾。所以实际上我的命令是:

powershell.exe -noninteractive -command "c:\src\sln\project\..\PreBuild.ps1" "project.dll" "c:\src\sln\project\"

你看到了吗?这很微妙,花了我几分钟。最后是 \" 。这会转义引号,使字符串不受限制。因此缺少收盘价。

所以现在如果我简单地写下这一行:

<PreBuildEvent>powershell.exe -noninteractive -command "$(solutiondir)\..\PreBuild.ps1" $(TargetFileName) $(ProjectDir)</PreBuildEvent>

一切如期进行。这些引号真的是因为我害怕空格。如果有人在他们的道路上遇到了一些人,我会回去赌。