Powershell与C#的EscapeUriString产生不同结果

6

在使用标准C#代码和命令时,我遇到了以下问题:

Uri.EscapeUriString("[]")

I get :

"[]"

但是当我使用PowerShell时:

[Uri]::EscapeUriString("[]") 

I get

"%5B%5D"

请问有人能解释一下这些方法调用的区别吗?为什么我得到了不同的结果?如何强制PowerShell返回与标准C#相同的结果?

谢谢!

1个回答

3
这似乎与.NET版本有关。你的C#代码可能使用了更新的版本。
C#
// .NET 4.0
Uri.EscapeUriString("[]"); // OUTPUT: "%5B%5D"

// .NET 4.5
Uri.EscapeUriString("[]"); // OUTPUT: "[]"

PowerShell

# v5
[Uri]::EscapeUriString("[]") # OUTPUT: "%5B%5D"

# for reference
Add-Type "
using System;
namespace PowerShell
{
    public static class Uri
    {
        public static string EscapeUriString(string stringToEscape)
        {
            return System.Uri.EscapeUriString(stringToEscape);
        }
    }
}"
[PowerShell.Uri]::EscapeUriString("[]") # OUTPUT: "%5B%5D"

并没有所谓的“标准C#”。解决方案是确保两者都使用相同的.NET版本,或者实现自己的转义方法。

另外,可以使用System.Net.WebUtility.UrlEncode,它似乎在两种情况下都返回"%5B%5D"

更新

在使用.NET 6+的PowerShell Core中,相同的示例将返回所期望的[]


只是想强调一下我的发现,简单的C#控制台应用程序引用了System.dll v4.0.30319程序集,而Powershell引用了完全相同的dll。 - Yawe
@Yawe 我也发现了同样的问题,但我还不确定原因。你可以在 PowerShell 中执行你的 C# 代码(使用 Add-Type),并查看它是否返回与你的 PowerShell 命令相同的结果。 - marsze
@Yawe 所有的 .NET 4+ 应用程序都使用相同的运行时,因此使用相同的 System.dll 4.0。我猜想这个改变是在另一个程序集中进行的。 - marsze

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