Msbuild exec和curl:引号噩梦

3
以下是msbuild的Exec语句:
<Exec Command="curl.exe -f -O --url &quot;$(SourceURL)&quot;">

如果SourceURL中包含空格,则会失败。即使我尝试

<PropertyGroup>
    <SourceURL>http://www.example.com/url%20with%20spaces</SourceURL>
</PropertyGroup>

甚至更多

<PropertyGroup>
    <SourceURL>http://www.example.com/url&37;20with&37;20spaces</SourceURL>
</PropertyGroup>

msbuild 会自动将任何空格转换为字符(你能相信吗?),而curl尝试获取 http://www.example.com/url,但返回404错误。

我不明白为什么会这样。难道我没有正确引用URL参数吗?

[更新] 在命令提示符上,以下命令可以正常工作:

curl.exe -f -O --url "http://www.example.com/url%20with%20spaces"

虽然这个不行:

curl.exe -f -O --url "http://www.example.com/url with spaces"

我的问题实际上是:我如何防止msbuild将%20替换为空格?
使用curl 7.21.7 (i386-pc-win32) libcurl/7.21.7 OpenSSL/0.9.8r zlib/1.2.5和msbuild 3.5.30729.1在Windows 7上。祝好!

你尝试过在命令提示符下运行curl吗?如果是这样,你输入什么命令才能成功运行它? - Scott Langham
是的,命令提示符可以使用。我将编辑上面的帖子以显示命令行。 - Hendrik
我已经找到了一个解决方案,但是stackoverflow不允许我在接下来的6个小时内发布它...请稍后再来查看。 - Hendrik
2个回答

5

问题是:

  1. Msbuild会用空格替换%20
  2. 即使您使用%2520&37;20转义百分号,cmd.exe仍会将%2替换为空字符串,从而在命令行中保留0。

所以解决方案是:

<PropertyGroup>
    <SourceURL>http://www.example.com/url%25%2520with%25%2520spaces</SourceURL>
</PropertyGroup>

哎呀呀,这么复杂的转义序列让人头疼不已,你们有没有同感?


这应该被标记为正确答案。对我有用。 - Craig Norton

1

你还需要转义 & 符号:

<SourceURL>http://www.example.com/url%2520with%2520spaces</SourceURL>

1
仍然无法工作--由于URL被传递给Exec任务,cmd.exe将吃掉“%2”,并将其转换为空字符串,因此我只剩下“”。解决方案是添加另一个百分号:%25%2520有效。 - Hendrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接