PowerShell 技能连载 - 覆盖 Out-Default(第 1 部分)
Out-Default 是一个隐藏的 PowerShell cmdlet,它在每个命令执行结束时被调用,并且将结果输出到控制台。您可以将这个函数覆盖为自己的版本,例如忽略所有输出,或输出一条“机密”消息:
1 | function Out-Default |
以下是移除自定义覆盖函数的方法:
1 | PS C:\> del function:Out-Default |
PowerShell 技能连载 - 覆盖 Out-Default(第 1 部分)
Out-Default 是一个隐藏的 PowerShell cmdlet,它在每个命令执行结束时被调用,并且将结果输出到控制台。您可以将这个函数覆盖为自己的版本,例如忽略所有输出,或输出一条“机密”消息:
1 | function Out-Default |
以下是移除自定义覆盖函数的方法:
1 | PS C:\> del function:Out-Default |
PowerShell 技能连载 - 用 Out-GridView 做为输出窗口
通常,Out-GridView 打开一个窗口并且显示所有通过管道传输到该 cmdlet 的内容:
1 | PS C:\> Get-Service | Out-GridView |
然而,通过一点技巧,Out-GridView 就会变得更强大。您可以随时将信息通过管道传输到相同的输出窗口。
First, get yourself an instance of Out-GridView that thinks it is running in a pipeline:
首先,获取一个 Out-GridView 的实例,然后认为它在一个管道中运行:
1 | $pipeline = { Out-GridView }.GetSteppablePipeline() |
现在,您可以通过调用 “Process“ 来输出任何信息。每次调用 Process() 都好比将一个元素通过管道传给 cmdlet:
1 | $pipeline.Process('Hello this is awesome!') |
当操作完成时,调用 End() 结束管道:
1 | $pipeline.End() |
通过这种方式,您可以将信息记录到网格视图中,或者将其用作向用户显示结果的通用输出窗口。
PowerShell 技能连载 - 啤酒挑战结果:最短的密码分析代码
最近在 psconf.eu 上有一个挑战,用最短的代码来检查以前密码被入侵的频率。以下是结果(感谢 Daniel Rothgänger):
1 | [Net.ServicePointManager]::SecurityProtocol='Tls12''P@ssw0rd'|sc p -N;$a,$b=(FileHash p -A SHA1|% h\*)-split'(?<=^.{5})';((irm api.pwnedpasswords.com/range/$a)-split"$b`:(\d+)")[1] |
您可以用这段代码做为思维游戏来了解它的功能,或者简单地使用它:它接受一个密码(在我们的示例中是“P@ssw0rd”)并返回一个数字。这个数字是这个特定密码在以前的攻击中出现的频率。任何被看到的密码都被认为是不安全的。只有不返回数字的密码才是安全的。
PowerShell 技能连载 - 使用 GeoCoding:情感分析(第 5 部分)
某些地理编码 API 提供了复杂的情感分析,如下面的示例所示:
1 | "Most important museums of Amsterdam are located on the Museumplein, located at the southwestern side of the Rijksmuseum." | |
一段文本被发送到 API,并且 API 分析了地理内容且输出文本中找到的地理位置的详细信息:
1 | sentimentanalysis : @{allsentiments=; sentimentwords=; mainsentiment=} |
PowerShell 技能连载 - 使用 GeoCoding:文本扫描(第 4 部分)
地理编码可以自动从文本中提取地理信息。这个例子还展示了向服务器提交信息的一种新方法:在下面的例子中,数据用的是 HTML 表单中使用的相同机制发布到服务器。这样做通常是为了避免使用 URL 编码大量数据,因为当使用 POST 时,数据在 request 的 header 而不是 URL 中传输。这也允许发送更多的数据:
1 | 'Ma io stasera volevo cenare al lume di candela, non cucinarci! #Milano #blackout' | |
结果如下:
longt matches match
----- ------- -----
9.18067 1 {@{longt=9.18067; location=MILANO,IT; matchtype=locality; confidence=0.9; MentionIndices...
PowerShell 技能连载 - 使用 GeoCoding:将经纬度转换为地址(第 3 部分)
今天,我们要做相反的事情,把经纬度转换成一个地址:
1 | '52.37799,9.75195' | |
PowerShell 技能连载 - 使用 GeoCoding:将地址转换为经纬度(第 2 部分)
让我们从将地址转换为经纬度坐标开始。我们假设您已经阅读了前面的部分以完全理解代码示例。
下面是一些示例代码,它接受任意数量的地址,并返回它们的经纬度:
1 | 'One Microsoft Way, Redmond', |
结果看起来类似这样:
Address Long Lat
------- ---- ---
One Microsoft Way, Redmond -122.13061 47.64373
Bahnhofstrasse 12, Hannover, Germany 9.75195 52.37799
PowerShell 技能连载 - 使用 GeoCoding(第 1 部分)
去年,Google 改变了他们的服务条款,要求使用一个独立的 API 入口来使用他们的 geocode API。幸运的是,还有免费的替代,所以在这个迷你系列中我们想向您展示 PowerShell 可以如何处理地址和坐标。
所有这些功能需要 REST API 调用,所以无论需要通过 REST API 发送什么信息,都需要先编码成能做为 Web URL 的一部分发送的格式。
我们先聚焦在如何将文本编码为 REST API 调用的一部分:
1 | $address = 'Bahnhofstrasse 12, Hannover' |
当您查看结果时,您可以很容易地看到进行了许多修改:
Bahnhofstrasse+12%2C+Hannover
PowerShell 技能连载 - 在 Web Request 中使用会话变量
有些时候,Web Request 在浏览器中可以正常工作,但是在 PowerShell 中却不能。例如,当您在浏览器中导航到 http://www.geocode.xyz/Bahnhofstrasse,Hannover?json=1,可以获得 JSON 格式的坐标地址。
而当在 PowerShell 中做同样操作时,会得到奇怪的异常:
1 | $url = 'http://www.geocode.xyz/Bahnhofstrasse,Hannover?json=1' |
结果如下:
1 | Invoke-RestMethod : { "success": false, "error": { "code": "006", "message": "Request Throttled." } } |
这里的秘密是需要先获取会话状态,会话状态包括 cookie 和其它细节,然后再根据会话状态重新提交 Web Service 请求。以下是它的工作方式:
1 | $url = 'http://www.geocode.xyz' |
现在结果看起来正确了:
1 | standard : @{stnumber=1; addresst=Bahnhofstrasse; postal=30159; region=DE; prov=DE; city=Hannover; |
PowerShell 技能连载 - Left Side of Comparison
当使用比较运算符时,请确保明确的部分放在左边。这是因为 PowerShell 查找运算符的左边并且可能会自动改变右侧的数据类型。并且,当左侧是数组类型时,比较运算符可以作为过滤器使用。
请查看差异:
1 | $array = @() |
由于要比较数组,比较操作符的工作原理类似于过滤器,在第一个比较中不返回任何内容。而当您交换操作数,结果会返回 $false,这才是正确的答案:一个数组,甚至是一个空的数组,不等于 null。