爱上PowerShell

2023-12-27 08:50
文章标签 powershell 爱上

本文主要是介绍爱上PowerShell,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Shell带来的好处是毋庸置疑的,当然也需要大量的时间去练习。PowerShell作为后起之秀,同时试图打造一款更加人性化,更加易用的Shell。随着PowerShell开源跨平台的战略以及在Windows下的的崛起,PowerShell有望成为下一个更加流行的Shell。
当然,PowerShell吸引我的地方不仅仅是开源跨平台,而在于PowerShell吸收了Shell的众多优点,同时进行了精心设计,从一个程序员的角度出发,PowerShell简单而又贴心的设计吸引着我去学习它并使用它。


下面列举一些PowerShell让我着迷的地方:

完善的帮助文档

学习Powershell应该从Get-Help学起,熟练使用这个命令将增加使用者的信心,掌握Get-Help的用法可以避免你把Powershell的每个命令都学习一遍。
下面用一个简单例子说明如何Get-Help,设想这样一个场景:
你想通过命令行查看所有进程,你第一个反应应该是用一个跟Process相关的命令来达到此目的,所以你可能会尝试执行:

Get-Command *Process

于是你得到了下面的列表:
Get-Command
再通过Get-Help命令来查看详细用法:

Get-Help Get-Process -full

就能得到Get-Process的详细用法和Examples,当然你还可以通过Get-Help Get-Process -Examples只查看Examples。
Get-Help


一致性

这种一致性体现在PowerShell的方方面面,他只有少许简单的规则,使用者只需要记住少量规则就能推断出代码的意图。
以Powershell的命令为例,只需简单一步即可弄清楚各种文件操作命令:

  1. Get-Help FileSystem

下面截取了一段关于文件和文件夹的复制操作例子:
Get-Help
再看看有哪些命令用来操作文件:

New-Item #新建
Rename-Item #重命名
Copy-Item #复制
Get-ChildItem #列出所有文件
...

你能推断出移动文件和删除文件的命令吗?没错,他们分别是:Move-ItemRemove-Item
读/写文件分别是:Get-ContentSet-Content

想快速搞清楚New-Item的用法?使用 Get-Help New-Item -Examples

也许你觉得这些命令相对于ls/cp.rm/rmdir/mv/cat有些繁琐,你可以使用Alias:

Get-Alias -Definition New-Item

Get-Alias
所以New-Itemni是等效的,不过在智能提示和Tab键的帮助下,New-Item表达的意图比起ni清晰多了。

你之所以能快速掌握PowerShell对文件的操作,一个重要的因素就是因为他的命令和参数遵循了一致性的设计原则,你可以通过复制文件命令Copy-Item推断出移动文件命令为Move-Item,你可以把时间花费在如何解决问题上,而不是去钻研各种稀奇古怪的命令和用法。

正如王垠所言,一门优秀的语言应该像中国象棋,只需少量规则就可以玩,或者说每条规则都很直截了当。反之有着复杂规则的语言像国际象棋,会有“王车易位”这样复杂古怪的规则。


提供了可以被flow的模块化机制

作为一个轻量级的脚本语言,一个可以被flow的骨架或者模块化机制是必要的,PowerShel提供了普通的脚本文件用来编写规模较小的脚本。

针对一个函数提供了一个模板,促使你写出更加规范的脚本:

function Get-PSFiles()
{begin{#...}process{#...}end{#...}
}

同时提供了Module来编写模块化的脚本。使用Export-ModuleMember还可以决定某个函数是不是可以暴露给用户。


一个面向对象的Shell

不同于Linux下的Bash, 你需要熟练掌握字符串的操作方法, PowerShell是一个面向对象的shell,所有命令和返回结果都是基于对象的,这意味着你可以通过调用返回对象的方法来达到同样的目的。
通过管道符列出对象的所有成员:
Get-Member
由于返回值是一个对象,所以我们可以通过调用对象本身的方法、属性来达到操作字符串的目的。
基于对象还可以很轻松的做出排序、分组、过滤操作,例如按照属性vm排序就可以通过下面的命令来完成:
Get-Process | Sort-Object -Property vm

再想想你在Bash下如何实现这个功能。


鉴于PowerShell有着以上众多优秀的设计,我几乎没花费多久就可以轻松使用这个工具,这让我想起学习Linux Bash的经历,我曾经花费了大把的时间浪费在折腾各种稀奇古怪的问题上,把自己沉浸在别人设计的复杂的规则中,更郁闷的是好不容易记住的一些命令及其参数,一旦不去使用就会忘记。

开始我们的PowerShell之旅吧!

PsGet-Powershell中的包管理工具

PsGet本身是一个PowerShell的Module,PsGet可以通过两种安装方式,

  • 方式一:直接在PowerShell执行这个命令
(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex

iexInvoke-Expression的别名,用来执行一段PowerShell脚本,所以上面的命令等价于:

Invoke-Expression (new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1")

而http://psget.net/GetPsGet.ps1返回了一段PowerShell脚本,脚本的大概内容是将PsGet的Module保存在PowerShell默认的Module目录。Module一旦被安装在PowerShell的缺省目录,就可以直接在PowerShell命令行使用该Module了。

  • 方式二:既然能够通过PowerShell脚本来自动安装,就可以通过手动的方式完成同样的操作。该手动安装方法同样适用于其他无法通过PsGet管理的Module。
    该手动安装过程包括两步:
  1. 从https://github.com/psget/psget/ 下载PsGet.psm1
  2. 把PsGet.psm1拷贝到PowerShell默认的Module目录
    通过$env:PSModulePath命令得到默认的Module目录
    Module-path

PsGet安装完毕,安装几个常用的PowerShell工具来试试看:


文件夹书签-go

Install-Module go

go非彼go, 这里的go是PowerShell中的一个书签工具,玩shell的痛点之一在于经常需要在不同的文件夹下切换,据我观察隔壁耍命令行的大叔90%都是cd,看看这个工具如何来帮助我们?

通过 gd -help 来查看go的玩法

通过gd label -add的方式把当前目录加入的书签中

C:\Windows> gd windows -add

然后在任意目录即可通过gd label的方式切入到书签所在的目录

C:\Works> gd windows
C:\Windows>

pscx工具集

Install-Module pscx

pscx是PowerShell Community Extensions的缩写,很明显这个工具集是对PowerShell的补充,提供了诸多命令:

Get-Command -Module pscx

pscx


构建自动化build脚本工具psake

Install-Module psake

psake是一个用来构建自动化build脚本的工具,他的灵感来源于Ruby中的rake,当然跟一些前端的工具诸如gulp也有点类似。利用该工具,用户可以通过简单且模块化的脚本方式来构建build脚本。

一个具有编译、打包.net控制台程序的脚本如下:

task -name Build -description "builds artifacts" -action{exec{msbuild ./ConsoleApplication1/ConsoleApplication1.csproj /t:build /p:Configuration=debug}
}task -name Clean -description "deletes artifacts" -action{exec{msbuild ./ConsoleApplication1/ConsoleApplication1.csproj /t:clean /p:Configuration=debug}
}task -name Rebuild -depends Clean,Build -description "rebuilds all artifacts from source"task -name PackageZip -depends Build -description "produces a zip archive of the build output" -action{dir ./ConsoleApplication1/bin/debug | write-zip -output app.zip
}

以上脚本定义了4个task,分别为Build,Clean,Rebuild,PackageZip。

通过下面命令来执行Rebuild任务

Invoke-psake -buildFile .\default.ps1 Rebuild

psake

当然你可以在PsGet的仓库中找到更多的工具。


通过PSSession来执行远程命令

PowerShell容许你在远程机器上运行命令,这种方式有点类似于在远程Terminal上使用SSH。

Enter-PSSession -ComputerName 127.0.0.1 -Port 5985 -Credential richie

以本机为例,通过Enter-PSSession命令开启了远程命令行,进而以登录用户的权限执行PowerShell命令。
pssession


跨平台

2016年8月份,微软宣布开源PowerShell,并且发布基于dotnet core的linux和mac版本,github提供了不同平台的安装方式。

下图展示了如何在Mac下使用PowerShell,有没有觉得很帅气。
Mac-ps


Azure PowerShell

Azure提供了一整套的PowerShell脚本来管理Azure,你可以使用Azure提供的PowerShell来创建和配置云服务、虚拟机、虚拟网络以及应用程序。

例如,你可以使用下面的命令登录你的Azure账号:

Login-AzureRmAccount

用下面的命令创建资源组

New-AzureRmResourceGroup

使用下面的命令来创建一台虚拟机

New-AzureRmVM
...

所有这些操作都等同于你直接操作Azure Portal。


PowerShell Desired State Configuration(DSC)

DSC是基于PowerShell的一套资源管理组件,用来帮助用户部署和管理应用程序。该扩展吸取了一些语言或者框架的设计灵感,旨在通过申明的方式来达到配置和维护应用程序环境的目的。

例如下面的脚本片段用来安装IIS以及创建一个Website

 WindowsFeature IIS  {  Ensure          = "Present"Name            = "Web-Server"}  WindowsFeature IISManagement  {  Ensure          = "Present"Name            = "Web-Mgmt-Console"DependsOn       = "[WindowsFeature]IIS"} xWebsite DefaultSite   {  Ensure          = "Present"Name            = "Default Web Site"State           = "Stopped"PhysicalPath    = "C:\inetpub\wwwroot" DependsOn       = "[WindowsFeature]IIS"}  

DSC通过声明的方式来完成对资源的管理和配置,将使用者的重心从如何实现转移到达到何种目的


总结

正如本文所说,PowerShell是一款经过精心设计的shell,也是对开发人员和管理人员十分友好的一个工具,本文总结了PowerShell的一些使用场景,感兴趣的同学可以继续学习如何编写PowerShell脚本,虽然PowerShell已经跨平台,但是目前阶段还只在Windows下发力,期待在未来,PowerShell能够在Linux和Mac上发展的越来越好。

这篇关于爱上PowerShell的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/542589

相关文章

SDUT2889_爱上CF(模拟)

爱上CF Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 CF,codeforces不是Crossfire。身为一个Acmer,RE大神与Soaring大神最喜欢做每五天一次的CF,从11:30到1:30,然后和逗比学长们一起等着跑数据等到两点半,然后再一起嘲笑一坨学长和柴爷,实在是人生一大快事。

自动化Windows开发工作流程:使用PowerShell脚本实例

自动化Windows开发工作流程:使用PowerShell脚本实例 开发工作流程常占据了大量的手动任务,如构建、测试、部署代码和管理工具。可以通过使用脚本语言,如PowerShell,来自动化这些任务。 PowerShell是一个强大的对象管理模式的shell和脚本语言,用于管理大量复杂的系统任务。对于开发人员,它可以用于构建和自动化开发工作流程。 环境准备 具有Windows的开发环境和

windows powershell 用户权限策略问题

https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2 执行命令 绕过检查 Set-ExecutionPolicy -ExecutionPolicy Bypass

PowerShell脚本编写

在Windows开发环境中,PowerShell脚本编写是自动化工作流程的强大工具。PowerShell不仅提供了丰富的命令集来管理Windows系统,还支持脚本编写,允许开发者创建复杂的自动化任务来简化日常开发流程。以下将详细探讨如何使用PowerShell脚本自动化Windows开发工作流程,涵盖环境设置、依赖管理、代码编译、测试执行、部署以及持续集成/持续部署(CI/CD)等方面。 一、环

爱上CF

<span style="color: rgb(58, 128, 0); ">Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^</span> 题目描述 CF,codeforces不是Crossfire。身为一个Acmer,RE大神与Soaring大神最喜欢做每五天一次的CF,从11:30到1:30,然后和逗比学长们一起等着跑数据

如何利用PowerShell完成的Windows服务器系统安全加固实践和基线检测

0x00 前言简述 最近单位在做等保测评,由本人从事安全运维方面的工作(PS:曾经做过等保等方面的安全服务),所以自然而然的与信安的测评人员一起对接相关业务系统的检查,在做主机系统测评检查时发现了系统中某些配置不符合等保要求,需要对不满足要求的主机做进一步整改,好在我们众多的系统基本都是运行在虚拟机上搭建的kubernetes集群中,这样一来就可以尽可能减少加固系统给应用带来的影响,我们可以一台

PowerShell脚本编写:自动化Windows开发工作流程

在现代软件开发中,自动化已经成为提高效率和降低人为错误的重要手段之一。Windows开发者尤其依赖于自动化脚本来简化日常工作流程。PowerShell作为Windows的强大命令行工具和脚本语言,为开发者提供了丰富的功能和灵活性,使得多种开发和管理任务的自动化成为可能。本文将探讨PowerShell的基本概念、如何利用PowerShell自动化Windows开发工作流程,以及实际操作案例,帮助

windows命令行cmd和powershell中文乱码错误解决办法

问题 windows的powershell中文乱码了 解决办法 临时解决 查看当前的系统编码 chcp 使用 powershell 或者 CMD 时中文显示乱码,每次都要手动执行: chcp 65001 如果输出结果是 65001,说明就修改成功了 永久解决 打开 控制面板—>时钟和区域—>区域->管理—>更改系统区域设置 然后重启就可以了

PowerShell自动化Windows系统管理任务

使用PowerShell自动化Windows系统管理任务是系统管理员提高工作效率、减少人为错误并优化系统管理流程的重要手段。PowerShell作为Microsoft开发的一个跨平台命令行工具和脚本语言,不仅支持Windows,还可在Linux和macOS上运行,为系统管理员提供了强大的自动化能力。以下将详细探讨如何使用PowerShell自动化Windows系统管理任务,涵盖多个关键领域,包括文

使用PowerShell自动化Windows系统管理任务

1. 管理服务 列出所有服务 Get-Service 启动服务 Start-Service -Name "ServiceName" 停止服务 Stop-Service -Name "ServiceName" 2. 管理计划任务 创建计划任务 $Action = New-ScheduledTaskAction -Execute "C:\Path\To\Executable.ex