内容字号:默认大号超大号

段落设置:取消段首缩进段首缩进

字体设置:切换到微软雅黑切换到宋体

业界
软件
手机
数码
电脑
学院
测评
图赏
视频
游戏
原创
直播
 AI
5G
苹果
微软
iPhone
Win10
精准搜索请尝试:精确搜索

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

2017/8/9 17:33:10来源:IT之家作者:贾福泰责编:文轩/实习评论:

感谢 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(注意扩展名)

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

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

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

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

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

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

5、写在最后的话

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

相关文章

IT之家,软媒旗下科技门户网站 - 爱科技,爱这里。

Copyright (C)RuanMei.com, All Rights Reserved.

软媒公司版权所有