IT之家学院:编写可在PowerShell中运行的命令行版中英互译词典程序

  感谢IT之家网友 贾福泰的原创投稿

  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":"\u82f9\u679c"}]}

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

  echo $rsp.trans_result[0].dst

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

  3、完整代码

  

  下载地址:点击这里

  4、使用方法

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

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

  

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

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

  

  5、写在最后的话

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

声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
推荐阅读