MSBuild ZipDirectory任务在某些计算机上使用反斜杠,但在另一台计算机上使用正斜杠

MSBuild ZipDirectory任务在某些计算机上使用反斜杠,但在另一台计算机上使用正斜杠,msbuild,visual-studio-2017,Msbuild,Visual Studio 2017,以下内容是“部署”项目的一部分,我使用msbuild.exe(VS2017)从批处理文件手动运行该项目 在一台PC上,我使用VS2017的社区版。我可能也在那台机器上安装了VS2019(几周内无法检查)。关键是批处理文件强制使用VS2017。在另一台电脑上,我有VS2017 Professional 在使用Community Edition的PC上,此任务将创建正确的zip文件,该文件使用正斜杠作为路径分隔符。在使用VS2017Pro的PC上,该任务创建带有反斜杠的zip文件,这显然违反了规

以下内容是“部署”项目的一部分,我使用msbuild.exe(VS2017)从批处理文件手动运行该项目


在一台PC上,我使用VS2017的社区版。我可能也在那台机器上安装了VS2019(几周内无法检查)。关键是批处理文件强制使用VS2017。在另一台电脑上,我有VS2017 Professional

在使用Community Edition的PC上,此任务将创建正确的zip文件,该文件使用正斜杠作为路径分隔符。在使用VS2017Pro的PC上,该任务创建带有反斜杠的zip文件,这显然违反了规范,并导致了许多问题(生成的zip部署在Linux和Windows上)

指示DotNet 4.6.1或更高版本修复了创建ZIP文件时使用的路径分隔符。我将ToolsVersion=“15.8”指定为项目配置的一部分(ZipDirectory任务的最低版本),但如何强制MSBuild任务的DotNet版本

我尝试从PC上卸载所有早期版本的Dotnet SDK/target framework,但没有成功

还记录了一个覆盖(Switch.System.IO.Compression.ZipFile.UseBacklash),但它仅适用于应用程序,而不适用于MSBuild任务

与MS stuff一样,到处都有不一致的地方,我的谷歌技能不足以找到一个答案,我非常感激有人能为我指出正确的方向。

尝试使用

<ZipDirectory Condition="Exists('$(BuildDir)')"
    SourceDirectory="$(BuildDir)"
    DestinationFile="$([System.String]::Copy($(ReleaseDir)\$(MODNAME)-$(DLLVersion)_$(CurrentDate).zip).Replace('\', '/'))" />

实际上,我的所有代理都使用反斜杠作为路径。windows总是使用反斜杠作为路径,所以我想知道您是否对windows或VS IDE进行了一些更改,以便在该PC上使用正斜杠

Linux使用前斜杠,但Windows默认情况下不使用前斜杠

您可以打开C盘的文件夹,检查路径是否使用正斜杠。并确保您是否运行了一些cmd命令来使用它


打开VS IDE,与两台PC上的两个版本进行比较,打开扩展管理扩展,检查是否安装了导致此问题的扩展。

安装VS2019可以修复此问题

我的脚本似乎自动配置为使用最新版本的Visual Studio,而不是像我最初所说的那样强制自己使用VS2017

尽管构建脚本为其运行时框架报告的所有DotNet版本号仍然相同,但在VS2017和VS2019环境中运行的DotNet版本号显然有所不同


很高兴能弄清楚到底是什么以及是否有可能强迫VS2017 intall也使用它。

谢谢你的建议,但它不起作用;它仍然会创建包含反斜杠的拉链。是的,我知道DOS/Windows使用反斜杠作为路径分隔符,但是,这违反了ZIP文件规范。4.6.1版的DotNet(显然)使用正斜杠正确创建ZIP文件,如果您阅读了我在问题中包含的链接。它与Windows本身无关。没有,我没有对Visual Studio或我在其他电脑上的Windows安装做任何更改默认路径分隔符行为的操作。好的,进一步挖掘显示,我的任务正在使用最新的Windows DotNet运行时(无法卸载),而不是Visual Studio运行时运行。即便如此,它还是在使用dotnet4.8。所以我不明白为什么在这台电脑上用反斜杠写ZIP。我猜它将不得不等到我可以将环境与我的其他电脑进行比较。我甚至安装了DotNet5,但没有更新Windows DotNet.FWIW,我知道如何从我的项目文件中打印运行时框架信息。Environment.Version.ToString():4.0.30319.42000->DotNet 4.6或更高版本()尝试手动安装DotNet 4.8->失败(已安装更高版本)4.6.1->未更改任何内容(好的,我们显然已经在使用4.8…)已确认::System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription:4.8.4300.0
<ZipDirectory Condition="Exists('$(BuildDir)')"
    SourceDirectory="$(BuildDir)"
    DestinationFile="$([System.String]::Copy($(ReleaseDir)\$(MODNAME)-$(DLLVersion)_$(CurrentDate).zip).Replace('\', '/'))" />