C# 将其他语言转换为powershell或在powershell中使用该语言

C# 将其他语言转换为powershell或在powershell中使用该语言,c#,powershell,sharepoint,C#,Powershell,Sharepoint,我找到了这个密码 // "url" is the full destination path (including filename, i.e. https://mysite.sharepoint.com/Documents/Test.txt) // "cookie" is the CookieContainer generated from Wichtor's code // "data" is the byte array containing the files contents (

我找到了这个密码

// "url" is the full destination path (including filename, i.e. https://mysite.sharepoint.com/Documents/Test.txt) 

// "cookie" is the CookieContainer generated from Wichtor's code 
// "data" is the byte array containing the files contents (used a FileStream to load) 

System.Net.ServicePointManager.Expect100Continue = false; 
HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest; 
request.Method = "PUT"; 
request.Accept = "*/*"; 
request.ContentType = "multipart/form-data; charset=utf-8"; 
request.CookieContainer = cookie; request.AllowAutoRedirect = false; 
request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"; 
request.Headers.Add("Accept-Language", "en-us"); 
request.Headers.Add("Translate", "F"); request.Headers.Add("Cache-Control", "no-cache"); request.ContentLength = data.Length; 

using (Stream req = request.GetRequestStream()) 
{ req.Write(data, 0, data.Length); } 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream res = response.GetResponseStream(); 
StreamReader rdr = new StreamReader(res); 
string rawResponse = rdr.ReadToEnd(); 
response.Close();
rdr.Close();

它显然成功地将一个大文件上传到了一个sharepoint站点,但是我的代码在powershell中。是否现在就可以在powershell中以其形式使用它,或者甚至将其转换为powershell

参见下面的示例。我必须在类和函数中包装代码

$code=@”
使用系统、安全、策略;
使用System.IO;
Net系统;
公共类MySharepointTools
{
public void上传文件(System.String url、System.Net.CookieContainer cookie、System.Byte[]数据)
{
System.Net.ServicePointManager.Expect100Continue=false;
HttpWebRequest request=HttpWebRequest.Create(url)为HttpWebRequest;
request.Method=“PUT”;
request.Accept=“*/*”;
request.ContentType=“多部分/表单数据;字符集=utf-8”;
request.CookieContainer=cookie;request.AllowAutoRedirect=false;
request.UserAgent=“Mozilla/5.0(兼容;MSIE 9.0;Windows NT 6.1;WOW64;Trident/5.0)”;
请求。标题。添加(“接受语言”、“en-us”);
request.Headers.Add(“Translate”,“F”);request.Headers.Add(“缓存控制”,“无缓存”);request.ContentLength=data.Length;
使用(Stream req=request.GetRequestStream())
{req.Write(data,0,data.Length);}
HttpWebResponse=(HttpWebResponse)request.GetResponse();
Stream res=response.GetResponseStream();
StreamReader rdr=新的StreamReader(res);
字符串rawResponse=rdr.ReadToEnd();
response.Close();
rdr.Close();
}
}
"@
添加Type-TypeDefinition$code-Language CSharp
$tools=新对象MySharepointTools
现在可以使用

$Tools.UploadFile(url, cookie, data)
一般来说,C#代码很容易转换为PowerShell,因为C#使用与PowerShell(.NET)完全相同的底层类型系统和运行时环境

需要注意的几件事:

变量赋值 C#是一种类型安全语言,这意味着编译器保证变量的类型及其值,如您的示例所示:

HttpWebRequest-request=HttpWebRequest.Create(url);
//     ^          ^      \________________________/^      
//     |          |                  |             |
//|变量名|语句终止符“
//类型名|
//返回
//我们可以分配给“请求”的值
在PowerShell中:

  • 类型是隐式的,变量不绑定到单个类型(因此不需要类型名)
  • 变量引用的前缀为
    $
  • 要访问静态成员(如上面的
    Create()
    方法),我们使用以下语法:
    • [名称空间.类型名称]::成员
  • 是不必要的,语句后的换行符意味着终止
  • 因此,上述声明变为:

    $request=[System.Net.HttpWebRequest]::Create($url)
    

    布尔值 在PowerShell中,两个C#布尔关键字(
    true
    false
    )由两个名为
    $true
    $false
    的自动变量表示:

    [System.Net.ServicePointManager]::Expect100Continue=$false
    

    使用
    PowerShell没有可与之相比的构造。要确保处置实现了
    IDisposable
    的对象,您必须使用
    try
    /
    catch
    /
    最后

    $req=$request.GetRequestStream()
    试一试{
    $req.Write($data,0,$data.Length)
    }抓住{
    扔$_
    }最后{
    如果($req){
    $req.Dispose()
    }
    }
    

    建设者 PowerShell没有用于对象实例化的
    new
    关键字,但提供了可以包装C#构造函数的
    new object
    cmdlet:

    $rdr=新对象-TypeName System.IO.StreamReader-ArgumentList$res
    
    而不是:

    StreamReader rdr=新的StreamReader(res);
    
    在PowerShell 5.0及更新版本中,您现在也可以使用
    new
    静态方法调用构造函数:

    $rdr = [System.IO.StreamReader]::new($res)
    

    类型铸造 PowerShell支持两种显式强制转换,在C#中类似于
    (typename)variable
    ,但同样使用方括号而不是括号:

    [System.Net.HttpWebResponse]$request.GetResponse()
    
    并且(从3.0版开始),它还支持未经检查的强制转换(仍带有方括号):

    $request.GetResponse()-as[System.Net.HttpWebResponse]
    
    如果无法进行强制转换,后者将返回
    $null
    ,而不是抛出错误



    这会让你很快翻译。从codefind中的注释来看,为了生成
    $cookie
    容器,您可能还需要翻译“Wichtor的代码”。

    请记住,PowerShell有明确的命令来支持web请求。有两种:
    调用WebRequest
    调用RestMethod
    。查看有关这些命令的帮助,并查看帮助中的示例。不确定它是何时添加的,但它现在有用于实例化类型的
    ::new()
    。例如,
    [System.IO.StreamReader]::在PowerShell 5.0中添加了新的($res)
    @Patrik,当问到这个问题时,它的公共预览刚刚发布:-)