Jquery Powershell Invoke WebRequest…|选择-ExpandProperty inputfields(并非显示所有“inputfields”)

Jquery Powershell Invoke WebRequest…|选择-ExpandProperty inputfields(并非显示所有“inputfields”),jquery,html,forms,powershell,Jquery,Html,Forms,Powershell,如果您一直在使用下面的命令行查询简单的web表单,以识别生成后续表单帖子所需的所有输入字段。但是,我遇到了一个相对简单的web表单,它有两个输入字段,下面的命令无法识别它们: Invoke-WebRequest 'http://URI.com/index.aspx' -WebSession $Save | select -ExpandProperty inputfields | select name, value 。 在下面的HTML源代码示例中,上面的命令将标识具有“input nam

如果您一直在使用下面的命令行查询简单的web表单,以识别生成后续表单帖子所需的所有输入字段。但是,我遇到了一个相对简单的web表单,它有两个输入字段,下面的命令无法识别它们:

Invoke-WebRequest 'http://URI.com/index.aspx' -WebSession $Save | 
select -ExpandProperty inputfields | select name, value

在下面的HTML源代码示例中,上面的命令将标识具有“input name”(如下HTML所示)的所有内容;但是,不是其他输入类型;例如,“选择”、“文本区域”。我想知道可以识别以下HTML源代码示例中显示的所有输入字段类型的“命令行”;而且,通过Powershell Invoke WebRequest发布表单所需的任何其他不可预见的输入类型

HTML来源:

..align="right" style="white-space:nowrap;"><input name="MainPage$LastName"..
..align="right" style="white-space:nowrap;"><input name="MainPage$email"..
..align="right" style="white-space:nowrap;"><input name="MainPage$phone"..
..align="right" style="white-space:nowrap;"><select name="MainPage$CountryDropDownList"..
..align="right" style="white-space:nowrap;"><input name="MainPage$Description"..
..align="right" style="white-space:nowrap;"><textarea name="MainPage$DescribeHere"..
编辑:上面调用WebRequest的结果如下所示。如您所见,下面缺少*MainPage\u CountryDropDownList**MainPage\u descripebehere*

Key                                                                            Value
---                                                                            -----
__VIEWSTATE                                                                    /wEPDwULLTE5OT      
__EVENTVALIDATION                                                             /wEWEALtsrvJAgLkmtI29k...     
MainPage__FirstName                                                            Craig
MainPage__LastName                                                             Smith
MainPage__email                                                                 CraigSMith@gmail.com
MainPage__phone
MainPage__Project
MainPage__Submit                                                               Submit
编辑:我以前从未处理过VIEWSTATE和EVENTVALIDATION。有人能确认我可以发布我第一次启动websession时收到的相同的VIEWSTATE和EVENTVALIDATION值吗?当websession启动时,它们很容易存储在变量中。所以,希望当我发布时,这些值能保持原样

编辑:适用于建议使用小提琴的人。我已经使用该工具获取帖子的字段名。我特别希望通过命令行通过以下解决方案获取此信息(不幸的是,正则表达式不正确,但对于熟悉正则表达式的人来说,他们会知道我在尝试做什么:

$r.RawContent| sls -Pattern "(\<(input|select|textarea) name\=[""'])(?:(?=(\\?))\2.)*?\1" -allmatches | %{$_.matches} | %{$_.value}

$r.RawContent | sls-Pattern“(\
选择
文本
区域不是输入字段

对于您正在执行的操作,我建议您获取、启动并监控您在浏览器中手动执行的帖子。提交表单后,转到Fiddler并找到会话,查看原始请求。如果是帖子,则其正文如下所示:

usrname=keith&comment=some+pig.
将该信息作为传递给Invoke WebRequest的主体-主体参数,例如:

$wr = Invoke-WebRequest http://URI.com/index.aspx -WebSession $Save -Method Post `
         -Body @{'MainPage$CountryDropDownList'="United States";'MainPage$DescribeHere'="some text"}
只需将字段添加到此哈希表。如果字段名包含
$
,则必须在名称周围加上单引号,否则不需要引号,例如
-Body@{username=“john”;age=“42”}

这是我们为post到NetGear交换机以启用/禁用端口而提供的
正文
字符串:

$portStateBody = "unit_no=1&java_port=&inputBox_interface1=&portDesc=&adminMode=${PortState}&physicalMode=Auto&auto_power_down=Disable&short_cable=Disable&linkTrap=Enable&frameSize=1518&CBox_1=checkbox&inputBox_interface2=&submt=16&cncel=&err_flag=0&err_msg=&selectedPorts=g${PortNumber}%3B&multiple_ports=1"
请注意PowerShell变量
${PortState}
${PortNumber}
。此文本是从Fiddler的原始请求选项卡中复制/粘贴的,然后我在需要时替换了前面提到的PowerShell

如果确实要为这些元素正则化原始HTML,请尝试以下操作:

sls -inp $wr.RawContent -pattern '(?is)<(input|select|textarea)\s+.*?(?:id|name)\s*=\s*"([^"]+)"' -AllMatches | Foreach {$_.Matches} | Foreach {"Element: $($_.Groups[1].value) key: $($_.Groups[2].value)"}

sls-inp$wr.RawContent-pattern'(?is)你应该考虑得到小提琴手,观察一个会议后的网站,然后检查身体的要求。这应该给你足够的信息,关于如何使用IWR构建帖子。是的,我已经使用FIDDLE获得表单信息。我寻找一个OMMAND线解决方案,以获得所有形式的字段,使一个职位。我肯定它是P。通过“RawContent”属性和正则表达式可以得到我想要的东西。不幸的是,我不知道正则表达式是否足够好来实现这一点。我能找到的最接近的命令行是下面的命令行;但是,我告诉它在引号之间查找值时出错了:$r.RawContent | sls-Pattern”(\但是如果您查看Fiddler中的原始请求,Fiddler将向您显示进行POST所需的所有表单字段。我已经为NetGear交换机执行了此操作,以启用/禁用端口。有很多表单字段,但只需复制原始正文(使用表单编码字段)将其返回到帖子URL,并替换相应的值。我已经用NetGear交换模块中的一个示例更新了我的答案。我更新了我的帖子,将上面的$r.RawContent | regex过滤器包括在内。我只是想说清楚,当我说
raw
时,我不是在谈论响应对象。我是在说Fiddle中的GUI选项卡r、 谢谢你的帮助。说清楚点,我已经经常使用Fiddler了。:)超级简单易用。我本来应该提到这一点。我对通过powershell命令行获取这些字段有一个特定的要求。我应该与我发布的命令行比较接近;但是正则表达式过滤器不正确。我可能需要就stackoverflow问一个单独的正则表达式问题。
sls -inp $wr.RawContent -pattern '(?is)<(input|select|textarea)\s+.*?(?:id|name)\s*=\s*"([^"]+)"' -AllMatches | Foreach {$_.Matches} | Foreach {"Element: $($_.Groups[1].value) key: $($_.Groups[2].value)"}