用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 定义文本
使用双引号,可以让自己的定义的字符中的变量被内容替换;
$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
用powershell实现自动化操作的更多相关文章
- Atitit.web的自动化操作与信息抓取 attilax总结
Atitit.web的自动化操作与信息抓取 attilax总结 1. Web操作自动化工具,可以简单的划分为2大派系: 1.录制回放 2.手工编写0 U' z; D! s2 d/ Q! ^1 2. 常 ...
- splinter python浏览器自动化操作,模拟浏览器的行为
Splinter可以非常棒的模拟浏览器的行为,Splinter提供了丰富的API,可以获取页面的信息判断当前的行为所产生的结果 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有 ...
- Python实现浏览器自动化操作
Python实现浏览器自动化操作 (2012-08-02 17:35:43) 转载▼ 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是 ...
- [转载]Python实现浏览器自动化操作
原文地址:Python实现浏览器自动化操作作者:rayment 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是支持IE,而且项目也较久没 ...
- Saltstack自动化操作记录(2)-配置使用 【转】
之前梳理了Saltstack自动化操作记录(1)-环境部署,下面说说saltstack配置及模块使用: 为了试验效果,再追加一台被控制端minion机器192.168.1.118需要在master控制 ...
- Saltstack自动化操作记录(1)-环境部署【转】
早期运维工作中用过稍微复杂的Puppet,下面介绍下更为简单实用的Saltstack自动化运维的使用. Saltstack知多少Saltstack是一种全新的基础设施管理方式,是一个服务器基础架构集中 ...
- Saltstack自动化操作记录(2)-配置使用
之前梳理了Saltstack自动化操作记录(1)-环境部署,下面说说saltstack配置及模块使用: 为了试验效果,再追加一台被控制端minion机器192.168.1.118需要在master控制 ...
- Saltstack自动化操作记录(1)-环境部署
早期运维工作中用过稍微复杂的Puppet,下面介绍下更为简单实用的Saltstack自动化运维的使用. Saltstack知多少Saltstack是一种全新的基础设施管理方式,是一个服务器基础架构集中 ...
- 基于facebook-wda的iOS自动化操作实践记录
[本文出自天外归云的博客园] 原理 对于iOS自动化操作,主要靠WebDriverAgent来完成.在Mac电脑上连接真机iPhone,运行WebDriverAgentRunner会在Mac端启动WD ...
随机推荐
- 10个用Console来Debug的高级技巧
译者按: 我们往往会局限在自己熟悉的知识圈,但也应担偶尔拓展一下,使用一些不常见而又有用的技巧,扩大自己的舒适圈. 原文: 10 Tips for Javascript Debugging Like ...
- element vue Array数组和Map对象的添加与删除
使用场景: 一个后台系统中, 管理员要配置自定义字段后台要生成id和title,其他角色要使用自定义字段的表单, 添加数据, 但是每个要填写的对象的id 和title都是无法固定的,因此页面显示的ti ...
- vue从入门到进阶:渲染函数 & JSX(八)
Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接 ...
- Python相关机器学习‘武器库’
开始学习Python,之后渐渐成为我学习工作中的第一辅助脚本语言,虽然开发语言是Java,但平时的很多文本数据处理任务都交给了Python.这些年来,接触和使用了很多Python工具包,特别是在文本处 ...
- 求二叉树第n层节点数
在知乎看到今日头条的一个面试题“求二叉树第n层节点数”:https://zhuanlan.zhihu.com/p/25671699,想到了这样一个解法,欢迎大家交流 我的解法采用递归的思想,从0层开始 ...
- OkHttp的封装和使用详解
Github地址 compile 'cn.yuan.yu:library:1.0.2' 第一步:初始化我们的工具类 public class MyApplication extends Applica ...
- View体系之属性动画
(内容省略了valueAnimator和PropertyValueHolder使用) 属性动画的使用的主要方式是AnimatorSet和ObjectAnimator配合使用.ObjectAnimato ...
- leetcode-14最长公共前缀
leetcode-14最长公共前缀 题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower& ...
- 淘宝开放平台使用WebClient,WebRequest访问时的错误提示导致麻烦
淘宝开放平台(TOP)提供OAuth2.0支持 通过C#的WebClient/WebRequest直接访问时会提示grant type is empty,这是一个非常恼人的错误,你会发现即使传了这个参 ...
- vi中的全局替换
一.基本语法 替换命令语法: :[addr]s/源字符串/目标字符串/[option] 全局替换: :%s/源字符串/目标字符串/g 参数说明: [addr]--表示检索范围,省略时表示当前行. &q ...