zoukankan      html  css  js  c++  java
  • 用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)aaabb.exe"

    如我电脑上的广讯通不是开机自启动,就放在脚本中启动

    function gxt(){
        $gxt =  Get-Process | ?{$_.ProcessName -eq "GXT"}
        if($gxt -eq $null){
        Start-Process "C:Program Files (x86)GlodonGXTinGXT.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 = "$domainadministrator"
     $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

  • 相关阅读:
    java 数据结构(六):数组与集合
    java 数据结构(七):Collection接口
    java 数据结构(八):Iterator接口与foreach循环
    java 数据结构(九):Collection子接口:List接口
    java 数据结构(十):Collection子接口:Set接口
    java 数据结构(十一):Map接口
    java 数据结构(十二):Collections工具类的使用
    java 面向对象(三十二):泛型一 泛型的理解
    java 面向对象(三十三):泛型二 泛型在集合中的使用
    iOS下JS与OC互相调用(四)--JavaScriptCore
  • 原文地址:https://www.cnblogs.com/pu369/p/7245420.html
Copyright © 2011-2022 走看看