用powershell實現自動化操做

天天登陸OA太繁瑣,公司OA又只容許用IE,自己寫chrome擴展水平也不高,更搞不懂seleniumhtml

既然是windows下工做,固然還得微軟的東東。研究了幾天,才發現用powershell就很方便。chrome

閒話少說:首先在運行中輸入powershell,打開Windows PowerShell ISEshell

默認狀況下不能直接運行,先在ISE的命令行輸入編程

  set-executionpolicy remotesigned

 如今能夠編寫、保存和運行powershell腳本了。windows

#IE運行時的等待函數
function Wait($ie){
sleep 2
do{
sleep -Mi 200
}while($ie.Busy)
}
#打開新IE窗口的函數
function NavigateIE($url)
{
    $ie = new-object -com "InternetExplorer.Application";
    $ie.navigate($url);
    $ie.Visible=$true;
    [System.Threading.Thread]::Sleep(2000);
    return $ie;
}
#腳本開始
$ie = NavigateIE('www.baidu.com')
#獲取百度搜索框
$inputs=$ie.Document.getElementsByName('wd')
foreach($element in $inputs){
$element.value="我要搜索powershell"
 }

  實際應用中遇到的困難有:安全

有時僅用Wait函數還不夠,再加上等待的語句dom

[System.Threading.Thread]::Sleep(1000);

  有的網頁元素沒有ID,就用getElementsByTagName,如編程語言

$ie2 = NavigateIE("http://www.baidu.com");
[System.Threading.Thread]::Sleep(1000);
$doc2 = $ie2.document
$inputs = $doc2.getElementsByTagName("input")
foreach($el in $inputs)
  { 
  $namestr = $el.type
   Write-Host $namestr 
  if($namestr.Equals("button"))
  {   
    $el.click() 
   }   
   }

  網頁中有iframe,要用到contentDocument,這個問題困擾我好幾天函數

#模擬點擊iframe中審批類流程的more
$frame1 = $ie.Document.getElementById('Frame123').contentDocument;
$frame1.getElementById('more_888').click()

 還有的網頁有frameset,又困擾了半天,可用如下代碼先找到其中的frame加密

$frame = $ie.Document.frames.document.body.childNodes.item(3).childNodes.item(3)

  好比有個網頁中frameset下有frame,下面又有iframe,用如下語句才取得最後一個有ID的元素

$ie.Document.frames.document.body.childNodes.item(3).childNodes.item(3).contentDocument.getElementById('iFrameList').contentDocument.getElementById('tabTask')

 獲取相應alt屬性的img元素

$imgs = $ie.Document.frames.document.body.childNodes.item(3).childNodes.item(3).contentDocument.getElementById('iFrameList').contentDocument.body.getElementsByTagName("img")
$imgs |Where-Object{$_.alt -eq "查看流程"}| ForEach-Object{$_.alt}

   除了直接在命令行輸入變量名外,可用如下語句查看變量$i的方法和屬性

$i |Get-Member

 或輸出到文件中更方便看

#省略d:\的話,會在當前腳本目錄下生成1.txt
$i |Get-Member |out-file d:\1.txt

  在網址包含某個值以前,讓腳本循環等待

function WaitUrl($ie,$url){
sleep 2
do{
sleep -Mi 200
}while( $ie.LocationURL  -notlike  '*'+$url+'*')
}

  啓動應用程序

Start-Process "D:\Program Files (x86)\aaa\bbb.exe"

如我電腦上的廣訊通不是開機自啓動,就放在腳本中啓動

function gxt(){
    $gxt =  Get-Process | ?{$_.ProcessName -eq "GXT"}
    if($gxt -eq $null){
    Start-Process "C:\Program Files (x86)\Glodon\GXT\bin\GXT.exe"
    }
}

 還有就是登陸某些網頁時的windows認證的問題,總時彈出windows安全提示框,要求輸入用戶名和密碼

我但願最好是能模擬輸入和點擊肯定,但實現不了。最後只能加個循環等待手工輸入後繼續後面的工做,冏囧

參考了http://www.cnblogs.com/Joe-T/archive/2011/12/29/2283408.html,仍未解決

原創部分結束 

===========================================================

 如下是從網上搜來的內容:

 

  • Powershell 定義文本

  1. 使用雙引號,可讓本身的定義的字符中的變量被內容替換;

$site = "飛苔博客 Powershell博客"
$text = "$site $(get-date) $env:windir"
$text

 

輸出:
飛苔博客 Powershell博客 08/25/2012 18:49:41 C:windows

 

2.  使用單引號,可讓本身的定義的字符串原樣輸出;

$text = '$fei $(tai) $env:windir 飛苔博客 (20+2012)'
$text

 

輸出:
$fei $(tai) $env:windir 飛苔博客 (20+2012)

 

3. 文本中的兩種特殊字符, 一個是變量的前綴「$」,一個是反引號「·」位於數字鍵1左邊。

PS C:\> "computer name:$env:computername"
computer name: computer1

PS C:\> "current date:$(get-date)"
current date:05/07/2015 09:47:11

 

4. Powershell轉義字符

在其它編程語言中喜歡將反斜槓做爲轉義字符,可是在Powershell中扮演轉義字符角色的不是反斜槓,而是反引號「`」字符串中的反引號,會對緊跟隨其後的字符進行特殊處理。

 

#使用單引號閉合字符串輸出雙引號
'The site of my blog is"www.mossfly.com"'
#使用轉義字符輸出雙引號
「My blog site is` "www.mossfly.com`""
#在字符串中輸出換行符
「The site of my blog is `"www.mossfly.com`",`n飛苔博客"

 

輸出:

The site of my blog is」www.mossfly.com」
My blog site is」www.mossfly.com」
The site of my blog is 「www.mossfly.com」,
飛苔博客

 

5. Powershell轉義字符表

轉義字符 描述
`n 換行符
`r 回車符
`t 製表符
`a 響鈴符
`b 退格符
`’ 單引號
`」 雙引號
`0 Null
反引號自己

 

6. PowerShell中strings 定義多行文本

@「字符串」@格式定義多行文本,尤爲是較長的文本,再好不過了,這裏要注意開始和結束的標記必須另起一行。

@"
這首詩用來評價陶淵明的詩歌再好不過了
 
一語自然萬古新,豪華落盡見真淳。
南窗白日羲皇上,未害淵明是晉人。
"@

 

7. PowerShell中用戶的交互

若是要提示用戶輸入可使用read-host

PS E:> $name=Read-Host "請輸入您的用戶名"
請輸入您的用戶名: Mosser Lee
PS E:> "您輸入的用戶名爲:$name"
您輸入的用戶名爲:Mosser Lee

 

如何解析read-host中的變量?以經過ExpandString方法解析

PS E:> $inputPath=Read-Host "請輸入文件路徑"
請輸入文件路徑: $env:windir
PS E:> $inputPath
$env:windir
PS E:> $ExecutionContext.InvokeCommand.ExpandString($inputPath)
C:windows

 

如何將加密的密碼轉換爲普通文本?

PS E:> $pwd=Read-Host -AsSecureString "請輸入密碼"
請輸入密碼: ******
PS E:> $pwd
System.Security.SecureString
PS E:> [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd))
abc123

 

詢問用戶名和密碼

若是你想受權一個用戶須要提供用戶憑據,可使用Get-Credential命令,該命令會彈出一個安全對話框,一旦用戶輸入完畢,就會返回一個Credential對象包含用戶名和密碼

PS E:> $cre=Get-Credential MossserLee
PS E:> $cre
UserName                        Password
--------                        --------
MossserLee System.Security.SecureString

 

 如何輕鬆的得到用戶憑據,不須要用戶交互的輸入?

Function Get-DomainCredential()
{
 $domain=Get-DomainName
 $username = "$domain\administrator"
 $password = "123456"
 $cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,(ConvertTo-SecureString -String $password -AsPlainText -Force))
 return $cred
}

 

本文出自 「Ricky's Blog」 博客,請務必保留此出處http://57388.blog.51cto.com/47388/1643717

相關文章
相關標籤/搜索