将另一种语言转换为 powershell 或在 powershell 中使用该语言
Converting another language to powershell or using the language in powershell
我找到了这段代码
// "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?
见下例。我不得不将代码包装在 class 和函数中。
$code = @"
using System.Security.Policy;
using System.IO;
using System.Net;
public class MySharepointTools
{
public void UploadFile(System.String url, System.Net.CookieContainer cookie, System.Byte[] data)
{
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();
}
}
"@
Add-Type -TypeDefinition $code -Language CSharp
$tools = New-Object MySharepointTools
现在您可以使用
调用方法
$Tools.UploadFile(url, cookie, data)
C# 代码通常很容易转换为 PowerShell,因为 C# 使用与 PowerShell (.NET) 完全相同的底层类型系统和运行时环境。
注意事项:
变量赋值
C# 是一种类型安全的语言,这意味着编译器保证变量的 类型 及其值,如您的示例所示:
HttpWebRequest request = HttpWebRequest.Create(url);
// ^ ^ \________________________/^
// | | | |
// | variable name | statement terminator ";"
// type-name |
// static method call that returns a
// value we can assign to "request"
在 PowerShell 中:
- 类型是隐式的,变量不绑定到单一类型(因此不需要类型名称)
- 变量引用以
$
为前缀
- 要访问静态成员(如上面的
Create()
方法),我们使用以下语法:
[Namespace.TypeName]::Member
- 不需要
;
,语句后的换行符意味着终止
这样,上面的语句就变成了:
$request = [System.Net.HttpWebRequest]::Create($url)
布尔值
两个 C# 布尔关键字(true
和 false
)在 PowerShell 中由两个自动变量 $true
和 $false
表示:
[System.Net.ServicePointManager]::Expect100Continue = $false
using
PowerShell 没有可与 C#'s using
statement 相媲美的结构。为确保处置实现 IDisposable
的对象,您必须使用 try
/catch
/finally
:
$req = $request.GetRequestStream()
try{
$req.Write($data, 0, $data.Length)
} catch {
throw $_
} finally {
if($req){
$req.Dispose()
}
}
构造函数
PowerShell 没有用于对象实例化的 new
关键字,但提供了可以包装 C# 构造函数的 New-Object
cmdlet:
$rdr = New-Object -TypeName System.IO.StreamReader -ArgumentList $res
而不是:
StreamReader rdr = new 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]
后者将 return $null
,而不是抛出错误,如果转换是不可能的。
这应该可以让您立即翻译。从您的代码查找中的评论来看,您似乎还需要翻译 "Wichtor's code",以便生成 $cookie
容器。
我找到了这段代码
// "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?
见下例。我不得不将代码包装在 class 和函数中。
$code = @"
using System.Security.Policy;
using System.IO;
using System.Net;
public class MySharepointTools
{
public void UploadFile(System.String url, System.Net.CookieContainer cookie, System.Byte[] data)
{
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();
}
}
"@
Add-Type -TypeDefinition $code -Language CSharp
$tools = New-Object MySharepointTools
现在您可以使用
调用方法$Tools.UploadFile(url, cookie, data)
C# 代码通常很容易转换为 PowerShell,因为 C# 使用与 PowerShell (.NET) 完全相同的底层类型系统和运行时环境。
注意事项:
变量赋值
C# 是一种类型安全的语言,这意味着编译器保证变量的 类型 及其值,如您的示例所示:
HttpWebRequest request = HttpWebRequest.Create(url);
// ^ ^ \________________________/^
// | | | |
// | variable name | statement terminator ";"
// type-name |
// static method call that returns a
// value we can assign to "request"
在 PowerShell 中:
- 类型是隐式的,变量不绑定到单一类型(因此不需要类型名称)
- 变量引用以
$
为前缀
- 要访问静态成员(如上面的
Create()
方法),我们使用以下语法:[Namespace.TypeName]::Member
- 不需要
;
,语句后的换行符意味着终止
这样,上面的语句就变成了:
$request = [System.Net.HttpWebRequest]::Create($url)
布尔值
两个 C# 布尔关键字(true
和 false
)在 PowerShell 中由两个自动变量 $true
和 $false
表示:
[System.Net.ServicePointManager]::Expect100Continue = $false
using
PowerShell 没有可与 C#'s using
statement 相媲美的结构。为确保处置实现 IDisposable
的对象,您必须使用 try
/catch
/finally
:
$req = $request.GetRequestStream()
try{
$req.Write($data, 0, $data.Length)
} catch {
throw $_
} finally {
if($req){
$req.Dispose()
}
}
构造函数
PowerShell 没有用于对象实例化的 new
关键字,但提供了可以包装 C# 构造函数的 New-Object
cmdlet:
$rdr = New-Object -TypeName System.IO.StreamReader -ArgumentList $res
而不是:
StreamReader rdr = new 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]
后者将 return $null
,而不是抛出错误,如果转换是不可能的。
这应该可以让您立即翻译。从您的代码查找中的评论来看,您似乎还需要翻译 "Wichtor's code",以便生成 $cookie
容器。