如何调查powershell中的未知方法



我正在自学Powershell。关于最常见的事情,有很多信息,但当我遇到一件稍微过于具体的事情时,要么我遵循了别人以前的步骤,要么我迷路了。例如,我不知道如何获得特定方法的帮助。我将以我目前的情况为例,但问题是关于任何情况,而不仅仅是这个情况。

我正在尝试自动浏览Internet Explorer,为此我使用了本指南。然而,它只显示了GetElementsByTagName上的一个示例。我已经知道如何使用Get-Member,所以我遵循他的代码如下:

$ie = new-object -ComObject "InternetExplorer.Application"
$ie.silent = $true
$ie.navigate($requestUri)
while($ie.Busy) { Start-Sleep -Milliseconds 100 }
$doc = $ie.Document

之后,我使用Get-Member -InputObject $doc,这样我就知道了所有可能的方法,并且我看到了我需要的方法:GetElementByID。我试着这样使用它:

PS C:UsersMyuser> $main=$doc.getElementById("main")
Cannot find an overload for "getElementById" and the argument count: "1".
At line:1 char:1
+ $main=$doc.getElementById("main")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest

我知道它需要不止一个论点,但我不知道如何获得或找到任何关于它的文档

当你想知道一个函数/方法是做什么的,它期望什么时,你会怎么做?

PowerShell提供了一种非常方便的方法来检查方法,甚至构造函数签名(重载(

只需访问不带括号的方法名称,PowerShell就会显示为此方法定义的所有重载(签名(。例如:

# Method 
PS> 'foo'.ToUpper  # Inspect the .ToUpper() method - NO () at the end.
OverloadDefinitions
-------------------
string ToUpper()
string ToUpper(cultureinfo culture)
# Constructors, via a type literal (`[...]`) and its pseudo static new() method:
PS> [xml]::new  # Constructors for [xml] (System.Xml.XmlDocument)
OverloadDefinitions
-------------------
xml new()
xml new(System.Xml.XmlNameTable nt)

这种技术通常也适用于COM对象,例如您的情况:

$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate('http://example.org')
$ie.Document.getElementById  # Get signatures for .getElementById()

在Windows 10上的Windows PowerShell v5.1中,这将产生(摘要(:


OverloadDefinitions                                                                                                                                                                
-------------------                                                                                                                                                                
mshtml.IHTMLElement ... getElementById(string v)                                               
mshtml.IHTMLElement ... DispHTMLDocument.getElementById(string v)                              
mshtml.IHTMLElement ... IHTMLDocument3.getElementById(string v)                                                                                                                                                                                                                   

注意事项:对于某些COM对象签名在PowerShell Core v7之前的版本中列出,没有参数名称

例如,COM Automation服务器WScript.Shell受到影响:

Windows PowerShell和PowerShell Core 6.x:

PS> (New-Object -ComObject WScript.Shell).Popup
OverloadDefinitions
-------------------
int Popup (string, Variant, Variant, Variant)  # !! No parameter names.

在PowerShell Core 7.0(预览5(中:

PS> (New-Object -ComObject WScript.Shell).Popup
OverloadDefinitions
-------------------
int Popup (string Text, Variant SecondsToWait, Variant Title, Variant Type) # OK

对于cmdlet,我查找cmdlet联机文档(您可以查看https://learn.microsoft.com或者只是谷歌一下(。对于大多数cmdlet,获取联机文档的快捷方式是使用Get-Help cmdlet -Online。例如:

Get-Help Start-Process -Online

如果愿意,也可以使用help别名来代替Get-Help

对于.NET类,我也使用https://learn.microsoft.com,但为了确保您获得正确的类和成员,我将搜索包括命名空间在内的全名(当您将对象管道传输到Get-Member时可以看到这一点。从类文档中,您可以导航到该类的成员文档。

对于WMI类,我还再次查看https://learn.microsoft.com,搜索WMI类名,并导航到属于该类的任何成员属性或函数。

当然,这都是假设您正在寻找有关Microsoft构造的信息。如果您正在寻找第三方库文档,则需要参考该第三方的文档。

一般来说,如果您不太确定在哪里可以找到API文档,那么尝试通过任何搜索引擎进行搜索的一个好方法是"LIBRARYNAME API文档",其中LIBRARYNAME可以是您想要查找文档的库或类。通常,你会在最初的几次点击中找到一些相关的内容。

最新更新