power shell 脚本编程
Power Shell 简介
power shell 是微软公司为Windows管理员提供自动化管理的工具,可以通过脚本进行批处理,大大提高执行效率。从网上的资料来看似乎运维人员对power shell 的要求比较高。
学习动因
至于我为什么要学习power shell,主要是因为公司业务需要,要求在测试电脑上自动安装一些文件,从而完成自动化测试环境的配置,为了降低操作成本,要求我们自动化测试人员写一个power shell脚本,并与所需测试环境的配置文件一起打包,拷贝到测试电脑中,通过在测试电脑中以管理员身份运行powershell脚本,可在测试电脑中自动配置环境。
解决过程
我的需求有3个:1.将文件移动到指定文件夹。2.安装软件:检测测试电脑是否已安装该软件,如果已安装,则提示用户:是否要继续安装。3.开始新线程执行cmd命令批处理文件。
1.移动文件,删除文件的power shell 指令:
remove-item "要删除的文的件路径" -Recurse -force # 删除文件
copy-item "要删除的文件的路径" -Recurse -force # 复制文件
move-item "要删除的文件路径" -Recurse -force # 移动文件
参数解读:-Recurse: 删除给定位置的对象和所有位置的子项。
-force: 强制删除
2. 安装软件:
安装软件需要操作注册表,而power shell 6.2(似乎是)以下的版本,以管理员身份运行,默认不开启访问注册表权限,所以需要设置执行策略,打开注册表访问权限。命令如下:
Set-ExecutionPolicy Unrstricted -Scope Currentuser -Force -Confirm:$false
参数解读:命令 Set-ExecutionPolicy 后接所需执行策略的值(可选:Restricted,Allsigned, Remotesigned,Unrestricted,Bypass,Undefined),我图方便,直接设置成了Unrestricted。
-Confirm:因为window为安全起见,设置执行策略默认会弹出提示行,要求用户对执行指令进行确认,将此参数设置为false则可直接执行命令,不会进行询问。记得false前加$。(Tips:ps脚本中定义变量均是以$开头的)。
检查软件是否已在目标计算机上安装:
这里有两种方式:
1. 通过WMI查询,慢,特别慢。
Get-WmiObject win32_product
2. 查询注册表实现,这是我在网上down的代码,自己试着修改了一下,加一些判断条件实现我需要的功能:
# 定义一个函数
Function Get-Software {[OutputType('System.Software.Inventory')][Cmdletbinding()] Param( [Parameter(ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)] [String[]]$Computername=$env:COMPUTERNAME) Begin {}Process { $InstalledState = $falseForEach ($Computer in $Computername){ If (Test-Connection -ComputerName $Computer -Count 1 -Quiet) {$Paths = @("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall","SOFTWARE\\Wow6432node\\Microsoft\\Windows\\CurrentVersion\\Uninstall") ForEach($Path in $Paths) { Write-Verbose "Checking Path: $Path"# Create an instance of the Registry Object and open the HKLM base key Try { $reg=[microsoft.win32.registrykey]::OpenRemoteBaseKey('LocalMachine',$Computer,'Registry64') } Catch { Write-Error $_ Continue } # Drill down into the Uninstall key using the OpenSubKey Method Try {$regkey=$reg.OpenSubKey($Path) # Retrieve an array of string that contain all the subkey names $subkeys=$regkey.GetSubKeyNames() # Open each Subkey and use GetValue Method to return the required values for each ForEach ($key in $subkeys){ Write-Verbose "Key: $Key"$thisKey=$Path+"\\"+$key Try { $thisSubKey=$reg.OpenSubKey($thisKey) # Prevent Objects with empty DisplayName $DisplayName = $thisSubKey.getValue("DisplayName")If ($DisplayName -AND $DisplayName -notmatch '^Update for|rollup|^Security Update|^Service Pack|^HotFix') {$Date = $thisSubKey.GetValue('InstallDate')If ($Date) {Try {$Date = [datetime]::ParseExact($Date, 'yyyyMMdd', $Null)} Catch{Write-Warning "$($Computer): $_ <$($Date)>"$Date = $Null}} # Create New Object with empty Properties $Publisher = Try {$thisSubKey.GetValue('Publisher').Trim()} Catch {$thisSubKey.GetValue('Publisher')}$Version = Try {#Some weirdness with trailing [char]0 on some strings$thisSubKey.GetValue('DisplayVersion').TrimEnd(([char[]](32,0)))} Catch {$thisSubKey.GetValue('DisplayVersion')}$UninstallString = Try {$thisSubKey.GetValue('UninstallString').Trim()} Catch {$thisSubKey.GetValue('UninstallString')}$InstallLocation = Try {$thisSubKey.GetValue('InstallLocation').Trim()} Catch {$thisSubKey.GetValue('InstallLocation')}$InstallSource = Try {$thisSubKey.GetValue('InstallSource').Trim()} Catch {$thisSubKey.GetValue('InstallSource')}$HelpLink = Try {$thisSubKey.GetValue('HelpLink').Trim()} Catch {$thisSubKey.GetValue('HelpLink')}$Object = [pscustomobject]@{Computername = $ComputerDisplayName = $DisplayNameVersion = $VersionInstallDate = $DatePublisher = $PublisherUninstallString = $UninstallStringInstallLocation = $InstallLocationInstallSource = $InstallSourceHelpLink = $thisSubKey.GetValue('HelpLink')EstimatedSizeMB = [decimal]([math]::Round(($thisSubKey.GetValue('EstimatedSize')*1024)/1MB,2))}$Object.pstypenames.insert(0,'System.Software.Inventory')# 进行软件名匹配,我这里用的模糊匹配
If($DisplayName -match "软件名") { $InstalledState = $TrueWrite-Output $Object}} Catch {Write-Warning "$Key : $_"} }Catch {} } Catch {} $reg.Close() } Catch {} } } If(InstalledState -eq $True) {$State = Read-Host "检测到此电脑已经安装**,是否跳过此步骤(Y/N)? "While($State -ne "n" -and $State -ne "N" -and $State -ne "y" -and $State -ne "Y") {$State = Read-Host "输入有误,请重新输入(Y/N): "if($State -eq "n" -or $State -eq "N" -or $State -eq "y" -or $State -eq "Y"){break}}If($State -eq "n" -or $State -eq "N"){# 执行安装***的函数Write-Host "正在安装**"}Elseif($State -eq "y" -or $State -eq "Y"){Write-Host "不在安装**"}}Else {# 直接执行安装**函数Write-Host "正在安装**"}}}}
# 执行该函数
Get-Software
语法啥的就不细琐了,因为我也不会,比如后边的if判断我觉得应该可以精简,但本着能用就行的原则,暂时就先这样了,如果有有明白的大佬欢迎指正。
安装软件命令,我这里采用开启新线程的方式安装软件。
Start-Process -FilePath $安装包路径 -ArgumentList "arg1", "arg2",...
参数解读: -ArgumentList: 后接一些配置参数,以英文逗号分隔,我用到的为 : /S:以静默方式安装软件。还可以指定安装路径("\D=$安装路径"),但是我没有弄明白。
3。执行cmd批处理命令:
说白了就是执行一个里面有从cmd指令的.bat文件,与安装软件的过程类似,开启一个新线程,打开对应文件路径并执行即可。
总结
经过几天的接触,觉得power shell的确很强大,但是就自己的工作内容来看,我对powershell脚本的使用并不多,故并没有投入太多精力取进行系统的学习,只是针对性的根据自己的需求对部分命令进行了简单的了解,后续如果有需要,关于这方面的内容还会继续更,写这篇帖子算是学习笔记,记录一下自己的学习过程。
参考链接:
(68条消息) PowerShell快速高效地获取安装的软件列表_零点零一的博客-CSDN博客
PowerShell 删除文件夹 | D栈 - Delft Stack
(68条消息) 使用 PowerShell 收集已安装的软件_allway2的博客-CSDN博客_powershell获取安装的软件
power shell 脚本编程相关推荐
- Linux命令行与shell脚本编程大全:第2版
<Linux命令行与shell脚本编程大全:第2版> 基本信息 作者: (美)布卢姆(Blum,R.) 布雷斯纳汉(Bresnahan.C.) [作译者介绍] 译者: 武海峰 丛书名: 图 ...
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---34
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...
- 学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程
Linux Shell脚本教程:30分钟玩转Shell脚本编程 http://c.biancheng.net/cpp/shell/ 转载于:https://www.cnblogs.com/pegasu ...
- Linux命令行与shell脚本编程大全(第3版)
作者:[美] 布鲁姆(Richard Blum),布雷斯纳汉(Christine Bresnahan) 著,门佳,武海峰 译 出版社:人民邮电出版社 品牌:iTuring 出版时间:2016-08-0 ...
- 黑客进阶必读书《Linux命令行与Shell脚本编程大全》(第2版)
欢迎来到命令行和shell脚本编程的世界!厚厚的一本小样书,拿在手上,厚厚的一本,六百多页.不只是掂在手上的重量,更是一本优秀的初学者入门指南,又会是你的Linux书库中非常不错的参考书.如果你想从整 ...
- (shell脚本编程)linux如何利用脚本执行多条命令以及linux如何执行定时任务
文章目录 shell脚本编程 条件语句 脚本执行多条命令 执行定时任务 本文着重于提高我们的生产力,所以将这几个作为了一个专题. shell脚本编程 脚本中不同语句用分号隔开,和c语言一样. for, ...
- Linux_《Linux命令行与shell脚本编程大全》第十八章学习总结
时间:2017年12月04日星期一 说明:本文部分内容均摘取自书籍<Linux命令行与shell脚本编程大全>,版权归原作者所有.<Linux命令行与shell脚本编程大全>( ...
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---02
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---20
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...
最新文章
- 转 关于 D3D的 SetRenderState 以及AlphaBlend 和AlphaTest
- SVN钩子HOOK设置自动备份,服务本地可以看到所有更新内容。
- gnss单频软件接收机应用与编程_GNSS/GPS RTK定位 (手机,无人车定位,无人驾驶,因子图优化)...
- HDU1248 寒冰王座 【数学题】or【全然背包】
- 暑期训练日志----2018.8.5
- 某集团BI决策系统建设方案分享
- iPhone 3G 的摄像头怎么用啊~
- 设计模式入门-模板模式
- .NET实现中英文验证码
- Linux上的errno和strerror
- 教你js生成二维码-QrCodeJS
- 如何最简单把pdf转换word格式
- Sophix热修复的简单使用
- 《谁说菜鸟不会数据分析》数据处理 之 数据清洗--重复数据的处理
- TextView字体加粗
- Android 中定义图片的资源文件
- Ubuntu 版本 微信
- iOS 相册,图片裁剪工具(附demo)
- Educoder Python 计算思维训练——文件操作与异常处理
- virustotal采集案例
热门文章
- java宅急送下载_基于jsp的宅急送物流管理系统-JavaEE实现宅急送物流管理系统 - java项目源码...
- win 10 添加账号
- Unity3D热更新技术点——ToLua(下)
- Matlab按顺序读取文件夹内图片
- 模板引擎ejs与html,后台模板引擎ejs与前台模板引擎artTemplate的简单介绍
- Smart200与200PLC转以太网无需编程实现以太网数据交换
- python爬取天天基金历史净值_用Python抓取天天基金网基金历史净值数据
- 100 行 Java 代码实现一个表情包生成器!
- nonebot2——表情包生成插件
- python ddos攻击_DDoS攻击工具