u小马_微软原版 Win10/Win11 iso镜像下载

当前位置:首页 > 文章教程 > Win10教程

如何编写可在PowerShell中运行的命令行版中英互译词典程序?

时间:2017-08-10 来源:u小马 访问:次

1、首先介绍原理

就是调用百度翻译开放平台的在线API进行英汉单词互译。该API为 http://api.fanyi.baidu.com/api/trans/vip/translate 后面加参数,参数列表如下:

q:要翻译的单词

from:要翻译的单词的语言(zh / en)

to :要翻译成的语言(zh / en)

appid:百度翻译开放平台申请的开发appid

salt:Unix时间戳(就是从1970/1/1零点到当前时间的总毫秒数,13位)

sign:验证参数,将appid + q + salt + key(同样是在百度翻译开放平台里获取)进行md5混淆

2、逐行介绍代码

文章最后面有完整代码,所以头疼代码的朋友可以跳过此段直接滚动到最后

function SimpleTranslate ($word) { ***(其余所有代码都在该函数体内) }

声明函数,函数名为SimpleTranslate,该方法只有一个参数,参数名为word(就是要翻译的单词)

$timeStamp = [Long]([Double]::Parse((Get-Date -UFormat %s)) * 1000)

获取Unix时间戳,这一行先用PowerShell命令 Get-Date -UFormat %s获取当前时间并格式化为Unix时间(带秒的小数)

但是这个时间值是字符串类型,所以用.NET的类 [Double]::Parse来转为数值类型,之后乘以1000,并强转为Long来转为整型

$appid = "2015063000000001"

$key = "12345678"

$tohash = $appid + $word + $timeStamp + $key

这三行声明appid和key的变量,并且将appid, word(q), timeStamp(salt), key四个字符串连接起来准备进行md5混淆

$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider

$utf8 = new-object -TypeName System.Text.UTF8Encoding

$sign = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($tohash))).Replace("-", "").ToLower()

这三行使用.NET的方法进行md5,new-object相当于C#中的new,所以这三行相当于

var md5 = new MD5CryptoServiceProvider();

var utf8 = new UTF8Encoding();

BitConverter.ToString(md5.ComputeHash(utf8.GetBytes(tohash))).Replace("-","").ToLower();

因为 BitConverter处理过的字符串是98-62-51-6D-7E-7A-30-D3-17-1F-B8-42-B1-50-E0-88这种样子,所以去除“-”,并且转为小写

这一段声明params变量,类型其实是HashTable

$lngCheck = [System.Text.RegularExpressions.Regex]::Match($word, "[u4e00-u9fa5]").Success

这一段又是.NET的方法,相当于

var lngCheck = Regex.Match(word,"[u4e00-u9fa5]").Success

判断字符串word中是否有中文,如果有为true,否则为false

很简单,如果单词是中文,那么从中文翻译为英文,所以from = zh, to = en;反之则反

到此时所有参数都已经准备好了,之后准备调用了

$querystring = ""

$params.GetEnumerator() | ForEach-Object {$querystring += $_.Name + "=" + $_.Value + "&"}

这段比较复杂,|符号是管道传递,把符号左面的运算结果作为参数传到符号右面的表达式中

左面的表达式$params.GetEnumerator()返回了哈希表类型params的枚举数,传递到 ForEach-Object,所以这一行就是把params中的每一个值进行一次大括号里的操作,key=value并且后面加&(虽然感觉和c#里的foreach一样,功能也一样,但是这里是PowerShell标准表达式)

$url = "http://api.fanyi.baidu.com/api/trans/vip/translate?" + $querystring

所以这里的url就是最后要访问的完整url了

$rsp = wget $url | ConvertFrom-Json

使用 wget 来访问url(了解unix的朋友会发现这里的wget和unix命令相似,是的,PowerShell中把很多命令通过Alias重命名为unix相似的命令,就是为了让习惯unix命令的开发人员容易上手,包括ls,ps等等)这里的wget实际上是Invoke-WebRequest

这个url获取的结果是一个json,格式为

{"from":"en","to":"zh","trans_result":[{"src":"apple","dst":"u82f9u679c"}]}

同样的,通过|管道传递给命令 ConvertFrom-Json将json转化为可操作的类型(PSCustomeObject)

echo $rsp.trans_result[0].dst

最后通过echo命令输出到控制台,一切就ok了

3、完整代码

如何编写可在PowerShell中运行的命令行版中英互译词典程序?

下载地址:点击这里

4、使用方法

将完整代码拷贝并保存为psm1文件,比如translate.psm1(注意扩展名)

如何编写可在PowerShell中运行的命令行版中英互译词典程序?

然后在左下角win徽标上点右键->windows PowerShell,或者小娜搜索PowerShell来打开PowerShell

如何编写可在PowerShell中运行的命令行版中英互译词典程序?

然后通过Import-Module来加载刚才保存的translate.psm1文件

然后就可以通过SimpleTranslate +词语来进行翻译了

如何编写可在PowerShell中运行的命令行版中英互译词典程序?

5、写在最后的话

PowerShell因为可以原生调用.NET类库,所以几乎可以完成所有你能想到或想不到的工作。

热门Win镜像下载

本类热门教程