2016-12-29 82 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請求是脆弱和容易出錯的。