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 脚本编程相关推荐

  1. Linux命令行与shell脚本编程大全:第2版

    <Linux命令行与shell脚本编程大全:第2版> 基本信息 作者: (美)布卢姆(Blum,R.) 布雷斯纳汉(Bresnahan.C.) [作译者介绍] 译者: 武海峰 丛书名: 图 ...

  2. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---34

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...

  3. 学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程

    Linux Shell脚本教程:30分钟玩转Shell脚本编程 http://c.biancheng.net/cpp/shell/ 转载于:https://www.cnblogs.com/pegasu ...

  4. Linux命令行与shell脚本编程大全(第3版)

    作者:[美] 布鲁姆(Richard Blum),布雷斯纳汉(Christine Bresnahan) 著,门佳,武海峰 译 出版社:人民邮电出版社 品牌:iTuring 出版时间:2016-08-0 ...

  5. 黑客进阶必读书《Linux命令行与Shell脚本编程大全》(第2版)

    欢迎来到命令行和shell脚本编程的世界!厚厚的一本小样书,拿在手上,厚厚的一本,六百多页.不只是掂在手上的重量,更是一本优秀的初学者入门指南,又会是你的Linux书库中非常不错的参考书.如果你想从整 ...

  6. (shell脚本编程)linux如何利用脚本执行多条命令以及linux如何执行定时任务

    文章目录 shell脚本编程 条件语句 脚本执行多条命令 执行定时任务 本文着重于提高我们的生产力,所以将这几个作为了一个专题. shell脚本编程 脚本中不同语句用分号隔开,和c语言一样. for, ...

  7. Linux_《Linux命令行与shell脚本编程大全》第十八章学习总结

    时间:2017年12月04日星期一 说明:本文部分内容均摘取自书籍<Linux命令行与shell脚本编程大全>,版权归原作者所有.<Linux命令行与shell脚本编程大全>( ...

  8. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---02

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...

  9. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---20

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...

最新文章

  1. 转 关于 D3D的 SetRenderState 以及AlphaBlend 和AlphaTest
  2. SVN钩子HOOK设置自动备份,服务本地可以看到所有更新内容。
  3. gnss单频软件接收机应用与编程_GNSS/GPS RTK定位 (手机,无人车定位,无人驾驶,因子图优化)...
  4. HDU1248 寒冰王座 【数学题】or【全然背包】
  5. 暑期训练日志----2018.8.5
  6. 某集团BI决策系统建设方案分享
  7. iPhone 3G 的摄像头怎么用啊~
  8. 设计模式入门-模板模式
  9. .NET实现中英文验证码
  10. Linux上的errno和strerror
  11. 教你js生成二维码-QrCodeJS
  12. 如何最简单把pdf转换word格式
  13. Sophix热修复的简单使用
  14. 《谁说菜鸟不会数据分析》数据处理 之 数据清洗--重复数据的处理
  15. TextView字体加粗
  16. Android 中定义图片的资源文件
  17. Ubuntu 版本 微信
  18. iOS 相册,图片裁剪工具(附demo)
  19. Educoder Python 计算思维训练——文件操作与异常处理
  20. virustotal采集案例

热门文章

  1. java宅急送下载_基于jsp的宅急送物流管理系统-JavaEE实现宅急送物流管理系统 - java项目源码...
  2. win 10 添加账号
  3. Unity3D热更新技术点——ToLua(下)
  4. Matlab按顺序读取文件夹内图片
  5. 模板引擎ejs与html,后台模板引擎ejs与前台模板引擎artTemplate的简单介绍
  6. Smart200与200PLC转以太网无需编程实现以太网数据交换
  7. python爬取天天基金历史净值_用Python抓取天天基金网基金历史净值数据
  8. 100 行 Java 代码实现一个表情包生成器!
  9. nonebot2——表情包生成插件
  10. python ddos攻击_DDoS攻击工具