在PowerShell中为dotnet pack传递多行PackageReleaseNotes参数
问题:PowerShell中dotnet pack传递含特殊字符/多行的PackageReleaseNotes参数失败
常规场景下,通过PowerShell给dotnet pack传递自定义发布说明很简单:
$releaseNotes = "Something" dotnet pack --configuration Release -p:PackageReleaseNotes=$releaseNotes
但当$releaseNotes变量包含特殊字符、多行内容及代码块时(示例内容如下),参数传递会出现异常:
# Release 2.8.1 - Integrate with Github Actions - Add Github Actions for build. Remove integration with AppVeyor - Add architecture tests to check if settings can be properly handled - Add debuging option for code gen # Improve TupleHelper User is no longer required to call for TupleHelper.ParseNext method. It's code was incorporated into ParseElement method. It's now enough to call: ```csharp var _helper = new TupleHelper(',', '∅', '\\', '(', ')'); var input = "(3.14, Ala ma kota)"; var enumerator = _helper.ParseStart(input, 2, "DoubleAndString"); var key = _helper.ParseElement(ref enumerator, TextTransformer.Default.GetTransformer<double>()); var value = _helper.ParseElement(ref enumerator, TextTransformer.Default.GetTransformer<string>(), 2, "DoubleAndString"); _helper.ParseEnd(ref enumerator, 2, "DoubleAndString");
All generated calls were updated accordingly
尝试过直接调用`dotnet pack --configuration Release -p:PackageReleaseNotes=$releaseNotes`及用`&`启动命令等方式,均无法正常传递变量。 # 解决方案 ### 方法1:使用Here-String定义变量+转义双引号 Here-String可以完美保留多行文本和特殊字符的格式,传递时只需转义内容中的双引号即可: ```powershell # 用Here-String定义发布说明,保留原始格式 $releaseNotes = @" # Release 2.8.1 - Integrate with Github Actions - Add Github Actions for build. Remove integration with AppVeyor - Add architecture tests to check if settings can be properly handled - Add debuging option for code gen # Improve TupleHelper User is no longer required to call for TupleHelper.ParseNext method. It's code was incorporated into ParseElement method. It's now enough to call: ```csharp var _helper = new TupleHelper(',', '∅', '\\', '(', ')'); var input = "(3.14, Ala ma kota)"; var enumerator = _helper.ParseStart(input, 2, "DoubleAndString"); var key = _helper.ParseElement(ref enumerator, TextTransformer.Default.GetTransformer<double>()); var value = _helper.ParseElement(ref enumerator, TextTransformer.Default.GetTransformer<string>(), 2, "DoubleAndString"); _helper.ParseEnd(ref enumerator, 2, "DoubleAndString");
All generated calls were updated accordingly
"@
调用dotnet pack时,转义内容中的双引号并包裹参数
dotnet pack --configuration Release "-p:PackageReleaseNotes=$($releaseNotes -replace '"', '""')"
### 方法2:通过临时文件传递内容 将发布说明写入临时文件,再读取文件内容传递给参数,避免直接传递复杂文本的转义问题: ```powershell # 将发布说明写入utf8编码的临时文件(无BOM) $releaseNotes | Out-File -Path "./temp-release-notes.txt" -Encoding utf8NoBOM # 读取文件内容并传递给dotnet pack dotnet pack --configuration Release "-p:PackageReleaseNotes=$(Get-Content "./temp-release-notes.txt" -Raw)" # 可选:删除临时文件 Remove-Item "./temp-release-notes.txt"
关键说明
- PowerShell向外部命令传递含特殊字符的参数时,需要用双引号包裹参数值,内部的双引号要转义为两个双引号(
"")。 - 使用
-Raw参数读取文件时,会保留文本的换行符和原始格式,避免内容被拆分。
内容的提问来源于stack exchange,提问作者Michał Bryłka
相关产品推荐
相关产品推荐

