用powershell實現自動化操作


每天登錄OA太繁瑣,公司OA又只允許用IE,本身寫chrome擴展水平也不高,更搞不懂selenium

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

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

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

  set-executionpolicy remotesigned

 現在可以編寫、保存和運行powershell腳本了。

#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函數還不夠,再加上等待的語句

[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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM