2016-12-29 79 views
1

目前我正在研究脚本以自动化IE中的进程以添加计算机名称及其MAC,以便我们可以对其进行映像。该页面有两个字段,一个用于MAC,另一个用于计算机名称,然后添加新按钮。我不得不通过提交后退出com对象来避免从页面弹出一个相当sl solution的解决方案。使用Powershell操纵CSV

我对Powershell还没有太多的经验,也没有使用CSV的经验,所以我在做这项工作时遇到了一些麻烦。我的目标是让脚本读取一行中的两个条目填写正确的字段,然后提交它,然后移动到下一行并重复。

现在它所做的是填充两个字段中未定义的字段,然后提交并重复。

编辑:我已经编辑了我的代码,所以它确认了什么试图阅读。 This is what the results look like.我相信@WalterMitty对$ ie.document.getElementsByName行有些问题,我只是试过$ ie.document.getElementById但没有填写任何字段。读取CSV似乎没有问题,但是输入正确读入字段的信息确实存在问题。

这是CSV的样子。

NewComputerName,NewMACAddress 
ComputerName1,111122223333 
ComputerName2,112233446677 
ComputerName3,AAAABBBBCCCC 
ComputerName4,AABBCCDDEEFF 

这就是我的代码目前的样子。

cls 

$URL = "" 
$iterator = 1; 
$csv = Get-Content C:\example1.csv 

foreach($row in $csv) 
{ 


#starts IE 
$ie = new-object -ComObject "InternetExplorer.Application" 
$ie.visible = $true 
$ie.navigate($URL) 

while($ie.Busy -eq $true) { start-sleep -Milliseconds 100 } 

($ie.document.getElementsByName("mc_id") |select -first 1).value = $_.NewComputerName; 
($ie.document.getElementsByName("mac_id") |select -first 1).value = $_.NewMACAddress; 
$ie.document.forms | Select -First 1| % { $_.submit() }; 

$ie.quit() 
$iterator++ 

write-host "$iterator new ID(s) added" 
write-host $row.NewComputerName - $row.NewMACAddress 
} 
+4

使用'Import-CSV'而不是'Get-Content',当你循环访问$ csv'中的$行时,使用'$ row'而不是'$ _'来访问事物。 – TessellatingHeckler

+0

仍然似乎吐出了未定义。 –

+1

[...不,不是?](http://i.imgur.com/Owaeudn.png)。 – TessellatingHeckler

回答

1
$URL = "" 
$iterator = 1 

# use Import-Csv for CSV files 
$csv = Import-Csv "C:\example1.csv" -Delimiter "," 

foreach($row in $csv) { 
    Write-Host "$iterator new ID(s) added" 

    #starts IE 
    $ie = New-Object -ComObject "InternetExplorer.Application" 
    $ie.Visible = $true 
    $ie.Navigate($URL) 

    while ($ie.Busy -eq $true) { Start-Sleep -Milliseconds 100 } 

    # $_ is not defined in foreach blocks, you have to use $row here 
    ($ie.Document.getElementsByName("mc_id") | Select-Object -First 1).Value = $row.NewComputerName 
    ($ie.Document.getElementsByName("mac_id") | Select-Object -First 1).Value = $row.NewMACAddress 

    $ie.Document.Forms | Select-Object -First 1 | ForEach-Object { $_.submit() } 

    $ie.Quit() 
    $iterator++ 
} 
+0

仍然似乎吐在两个字段中的“未定义” –

+0

添加了CSV分隔符,我想不出任何其他原因造成这种情况。请检查'$ csv'的内容。 – sodawillow

+0

仍然不会改变它。 –

1

我遇到类似问题,但我发现这可能会帮助你们 - 我也没有50声誉发表评论抱歉:/ ....

我搞砸周围Import-CSV命令的-Path,但我无法使其工作。显然,这与CSV文件的路径无关。术士张贴这在他的博客:

长话短说,从具有 我的CSV尾随空白列附带的错误。 Import-Csv使用CSV中的第一行作为 列的名称(除非另有指定),并且当您有空白列 (或至少多个空白列)时,会导致此错误,因为它的 没有有效的名称他们。

除了更改的文件,我改变了我的导入命令,包括头按戴尔的评论它完美地工作:

$data = import-csv "C:\Sharepoint.csv" -header("Department","AD Group","Members","Notes") 

术士和戴尔为我节省了大量的时间,请停止the Warlock’s blog,并给他们一个大的谢谢

1

考虑使用Import-Csv和Invoke-WebRequest的组合,例如像这样:

import-csv .\example.csv | %{ iwr http://someurl.local -body @{mc_id=$_.NewComputerName; mac_id=$_.NewMACAddress} -Method POST } 

它会读取csv文件,遍历记录并创建与每个记录值的应用程序/ x-WWW的形式了urlencoded POST请求。

当您使用iwr(Invoke-WebRequest)并传递一个散列表作为“主体”时,它将充当它是一个正在提交的表单。 POST方法将以application/x-www-form-urlencode的形式提交表单值。如果没有POST方法,它会提交表单,就好像它是一个GET,即传递url中的值。

如果您需要验证,会话支持等,请阅读Invoke-WebRequest的文档。

使用IE来自动化web请求是脆弱和容易出错的。