如何在powershell中调查未知方法?

如何在powershell中调查未知方法?,powershell,internet-explorer,methods,reflection,overloading,Powershell,Internet Explorer,Methods,Reflection,Overloading,我自己在学习Powershell。关于最常见的事情有很多信息,但是当我面对一件稍微过于具体的事情时,要么我遵循了别人之前的步骤,要么我迷路了。例如,我不知道如何获得特定方法的帮助。我将以我目前的情况为例,但问题是关于任何情况,而不仅仅是这一个 我正在尝试自动化一些Internet Explorer浏览,为此我使用了guide。 但是,它只显示了GetElementsByTagName上的一个示例。我已经知道如何使用Get Member,所以我遵循他的代码如下: $ie = new-object

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

我正在尝试自动化一些Internet Explorer浏览,为此我使用了guide。 但是,它只显示了
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
PS C:\Users\Myuser> $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

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

$ie = new-object -ComObject "InternetExplorer.Application"
$ie.silent = $true
$ie.navigate($requestUri)
while($ie.Busy) { Start-Sleep -Milliseconds 100 }
$doc = $ie.Document
PS C:\Users\Myuser> $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

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


当你想知道一个函数/方法的功能和期望值时,你会怎么做?

对于cmdlet,我会查阅cmdlet的在线文档(你可以查看它,也可以用谷歌搜索它)。获取大多数cmdlet的联机文档的快捷方式是使用
get-Help cmdlet-online
。例如:

Get-Help Start-Process -Online
如果愿意,也可以使用
帮助
别名代替
获取帮助

对于我也使用的.NET类,但为了确保获得正确的类和成员,我将搜索包括名称空间在内的全名(当通过管道将对象传递到
get member
时,您可以看到这一点)。从类文档中,您可以导航到该类的成员文档

对于WMI类,我还要再次查看,搜索WMI类名,并导航到属于该类的任何成员属性或函数

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


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

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中,这将产生(节略):


重载定义
-------------------                                                                                                                                                                
mshtml.IHTMLElement…getElementById(字符串v)
mshtml.IHTMLElement…DispHTMLDocument.getElementById(字符串v)
mshtml.IHTMLElement…IHTMLDocument3.getElementById(字符串v)
注意事项:对于某些COM对象签名在PowerShell Core v7之前的版本中列出,但没有参数名称,这会使理解它的功能变得更加困难

例如,COM自动化服务器
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)中:


另一方面:
.getElementById()
,至少在W10上,只接受一个参数;例如:
$ie=New Object-ComObject InternetExplorer.Application;$ie.Navigate('http://semver.org“);while($ie.Busy){sleep 1};$ie.Document.getElementById('spec').tagName