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,当问到这个问题时,它的公共预览刚刚发布:-)