Как исследовать неизвестный метод в powershell? - PullRequest
1 голос
/ 24 октября 2019

Я изучаю 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:\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

Я понимаю, что он ожидает более одного аргумента, но я не знаю, как получить или найти какую-либо документацию по этому поводу.

Чтоваш переход, когда вы хотите знать, что делает функция / метод и чего он ожидает?

Ответы [ 2 ]

1 голос
/ 24 октября 2019

PowerShell предлагает очень удобный способ проверять метод и даже конструктор подписи (перегрузки) :

Просто получить доступ к имени метода без скобок , и PowerShell покажет вам все перегрузки (сигнатуры), определенные для этого метода;.eg:

# 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 PowerShell v5.1 в Windows10 это приводит к сокращению:


OverloadDefinitions                                                                                                                                                                
-------------------                                                                                                                                                                
mshtml.IHTMLElement ... getElementById(string v)                                               
mshtml.IHTMLElement ... DispHTMLDocument.getElementById(string v)                              
mshtml.IHTMLElement ... IHTMLDocument3.getElementById(string 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):

PS> (New-Object -ComObject WScript.Shell).Popup

OverloadDefinitions
-------------------
int Popup (string Text, Variant SecondsToWait, Variant Title, Variant Type) # OK
0 голосов
/ 24 октября 2019

Для командлетов я просматриваю онлайн-документацию по командлетам (вы можете проверить https://docs.microsoft.com или просто погуглить). Для быстрого доступа к онлайн-документации для большинства командлетов необходимо использовать Get-Help cmdlet -Online. Например:

Get-Help Start-Process -Online

Вы также можете использовать псевдоним help вместо Get-Help, если хотите.

Для классов .NET я также использую https://docs.microsoft.com,но чтобы убедиться, что вы получаете правильный класс и член, я буду искать полное имя, включая пространство имен (это можно увидеть, когда вы перенаправляете объект в Get-Member. Из документации класса вы можете перейти к документации по элементу вэтот класс.

Для классов WMI еще раз я смотрю на https://docs.microsoft.com, в поисках имени класса WMI и переходе к любым свойствам или функциям-членам, относящимся к этому классу.

Конечно, все это предполагает, что вы ищете информацию о конструкциях Microsoft. Если вы ищете стороннюю библиотечную документацию, вам нужно будет сослаться на эту стороннюю документацию.

В общем, если выВы не совсем уверены, где можно найти документацию по API, и попробуйте поискать с помощью любой поисковой системы: «Документация API LIBRARYNAME», где LIBRARYNAMEэто может быть библиотека или класс, для которого вы хотите найти документацию. Обычно вы найдете что-то актуальное в первых нескольких хитах.

...