find-command管道符export-csv -PATH all_commands,俗话说,工欲善其事必先利其器,我们既然要经常与powershell的命令打交道,就要弄明白powershell究竟有多少个命令,这个命令获取了powershell服务上所有的命令,注意,这里面包含很多本地不存在的命令,以及命令所在的模块,知道命令所在的模块之后后面我们就方便安装这个模块并使用其中的命令了
ConvertFrom-Json $jsonStr 这个命令会将jsonString转换为json对象,这是它非常强大的地方,在java中,我们需要对jsonString进行对象序列化,而在powershell我们只需要使用一下这个命令就可以直接进行对象调用操作
find-module管道符export-csv -PATH all_modules,powershell 除了可以查找很多命令以外,还可以查找modules,find-module 获取的内容来自于一个网站,叫做powershellgalley,我们加上com可以直接进入这个网站,可以看到这个总的包数在21万个左右,相比maven和pypi确实不多,但是也够用了
install-module -name Selenium -AllowPrerelease ,为powershell安装selenium模块,这个命令可以说非常方便易用,最为关键的是我们直接从powershell gallery上面复制安装module的命令就可以了
get-command管道符where 大括号左.source -like 双引号Selenium双引号大括号右,这个命令将会获取Selenium所有的函数,这样我们就可以对selenium的函数有一个整体的了解了
反引号,也就是重音符,在powershell中是转移字符的意思,比如在下面这张图中,我使用反引号将双引号进行了转义,保证程序可以正常执行
$PSVersion 在这里我要区分一下powershell的desktop版本 和 core版本,因为这非常重要,因为它俩是不同的。。。我刚刚安装了selenium但是在desktop版本中无法使用。。windows自带的叫做desktop版本,你安装的powershell叫做core版本
Install-Module -Name Selenium,而且命令也不能直接拿过来用,在desktop版本中,我不能添加-AllowPrerelease参数,否则会报错,这一点要注意。
import-module -name Selenium,为什么要在desktop版本中安装selenium,直接在core中使用不行吗?不是的,因为PowershellISE不支持core版本,应该说core版本和desktop版本有很大的不同,一个显著的特点是在windows上除了有自带的powershell.exe以外你还可以安装powershell core,且code版本的启动文件为pwsh.exe 这一点要明白
powershell.exe 与 pwsh.exe 之间的区别,再由就是,core删除了很多cmdlet,因为这些cmdlet在linux和macos上面不支持。。。
Install-Module -Name Selenium,现在我们再打开powershell ISE 就会发现在右侧模块中已经有了Selenium,选择selnium 我们可以看到selenium支持的命令
start . ii . explorer(gl) 在powershell中,我们可以使用以上这三种方式打开当前文件夹。就像cmd中的 start. 一样,非常方便
ii 斜杠 可以打开当前根目录
gal ii gal start get-command explorer 我们可以通过这三种方式查看所执行命令的原始命令
$driver = start-sechrome ,回到powershell ISE ,输入这行命令,先别执行,现在执行会提示找不到 chrome binary ,这是因为原来的chromedriver.exe 已经很老了,我们需要更新一下chromedriver.exe ,具体在那儿更新呢?
get-module -listAvailable ,我这里要特别的讲一下get-module ,不带任何参数的get-module 只能获取当前控制台加载的module,要想获取所有有效的module我们应该使用 get-module listAvailable 这个命令
确定了selenium 的版本,以及其所在的目录,我们进入这个文件夹中,找到chromedriver.exe 然后换上最新的版本的。
$driver = start-sechrome;enter-seurl xxx.com -Driver $driver ,我们回到Powershell ISE界面,然后点击上面的三角运行
程序会弹出一个窗口,并进入百度首页,这样就意味着程序执行成功了
关于这个selenium-powershell的具体信息,我们可以参考github上的readme,里面介绍的蛮详细的
首先我们去nuget下载selenium的c#dll文件,但是注意,因为我之前已经安装了powershell的selnium,所以并没有真正的下载,因为powershell其实就是对c# selenium dll的封装,所以我们可以直接使用,第一个要做的就是将dll加入环境变量,然后New出 chromedriver的对象,下面的使用方式基本都和写c#的区别不大了
select-object,get-command管道符select-object name,version,source source,name,version 在powershell中你可以选择要显示的对象,准确的来说就是我们用红线圈起来的部分
where-object,select-object 我们来看一看这两者的区别,显然,select-object 只能选择列,和where-object则可以对其中的内容进行筛选,这两者的区别就在于一个对行进行操作,筛选,一个只能选择列
object 在powershell用的很广泛。因为powershell一切都是面向对象的,所以我们有必要了解一下对象是个什么东西,如果搞过java的人对这个应该有很深的感受,其实这张图片也讲的差不多了。我这里举例 人是一个类,张三是人的实例对象,张三的头发是黑色的,皮肤是黄的,这里的头发和皮肤就是属性 properties,张三会张嘴,吃饭,这里的张嘴吃饭就是方法。
get-command管道符where-object 大括号左$_.Name -like 双引号通配符object通配符双引号大括号右,get-command管道符findstr i 双引号object双引号,怎么说呢,我个人比较喜欢findstr的形式,但我们这里不讲这个,主要来看看object的操作方式。分别有Compare ForEach Get-WmiObject Group Measure New Register
powerhsell的变量标注定义很像python的类型标注,当然我们可以不用加任何类型的,可以直接$var 定义内容
$pid 这里是当前打开的powershell窗口的pid ,process ID号
$error powershell中的$error 自动变量代表的是你所有的错误的历史记录,在下图中可以看到powershell允许我们使用数组index来索引第几个第几个错误,index在0的永远是最新发生的错误的记录,$error 最多可以保存大概256条信息
dir env:在powershell中,环境变量就像证书以及盘符一样是可以进行遍历查询的,因此我们可以通过 dir env:的方式来查看系统所有的环境变量
$env:dir $env:tmp $env:path $env:java_home 等等,在powershell中,我们可以直接通过env:应用环境变量的变量名来获取其值
$input 首先这个自动变量只在powershell函数中可用,再来我们看一下它的具体作用,我们可以看到,elements后面数出来所有的参数内容,这意味着$input 在函数中表示所有的参数,包括我们看到将$input 初始化,这历的@符号是初始化的意思,之后赋值给$pipelineData ,我们获取了$input的所有内容,包括这些参数的总个数
$num=@(1,2,3) 在powershell中@代表初始化数组的意思
$true $false powershell的布尔值也必须使用$符号进行标注,这是我没有想到的,因为我们在编写powershell脚本时要特别注意这一点
$host 里面存储了powershell控制台的一些信息,在ISE 和 powershell窗口中运行的结果是不一样的,我们可以看到
$? 这个变量用于指示上一个命令是否执行成功,在下面这张图里你可以看到$? 上面的命令执行出错了,后面就是false了
$profile 里面都是powershell的配置文件,这些配置文件将会在powershell启动的时候运行,我这里是一个名为powershell_profile.ps1 每次在打开powershell时都会运行这个文件,文件的内容含义是每次打开都会指定console的编码为utf-8
gwmi -class win32_operatingsystem 获取操作系统的相关信息 系统目录 版本信息 版本号 注册用户 序列号 版本 ,这里的gwmi 就是 get-wmiobject
gwmi -class win32_operatingsystem管道符select 通配符,将获取所有的操作系统信息
($organization = gwmi -class win32_operatingsystem管道符select 通配符管道符select Organization).Organization ,进一步选择,我们将获取更为精确的内容
powershell 声明数组的方式,建议强制指定类型,这里看不出来什么区别,但在实际使用的过程中,如果一开始将$var 定义为字符串,那么后面的定义如果没有指定字符串,@(1,2,3,4)有可能也是字符串
powerhsell的数组支持简单的切片操作
$hashtable = @大括号左key1=双引号a双引号;key2=双引号b双引号大括号右,hash表这个东西在powerhsell中初始化的方式如下图所示,调用方式也有展示
$hashtable.Add(“key3”,“ccc”)在hash表中添加key 和 value的方式,与初始化时有一定区别,必须要添加双引号,如果不加的话,可能会被视为一个语句
$hashtable管道符select 通配符,要获取hash表的详细信息可以使用select命令
$modules=import-csv all_modules.csv 我们除了可以导出csv以外,还可以导入csv文件,并且直接调用对应的对象
$modules.name 可以获取name列的所有的内容
$modules管道符foreach大括号左$_.name大括号右 ,而在powershell2.0时你必须使用foreach这种方式才能够进行遍历
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 0 ,这个命令可以直接为电脑开启远程桌面,而无需打开GUI界面去设置,我这边已经尝试过,在win10系统确实可以用
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 1 , 同理,将值设置为1就是禁用的意思
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH✲' ,接下来谈一谈powershell中openssh的安装,首先获取openssh功能模块的信息,可以看到我这里是已经安装的状态
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 , 添加openssh 服务器模块开始安装,服务器模块的安装时间比较慢些
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0,Client端也是同样的安装步骤,chient安装的比较快些,注意。服务器端和客户端,在两台电脑上都要安装
ssh 服务器地址,然后回车,第一次会提示你信任什么的,你输入yes,回车然后会要求你输入密码,这里输入密码的过程是看不到的,光标也不会移动,回车后就会发现已经连上了,进入桌面,输入dir 回车成功执行命令
start-service sshd , 还有一个过程不要忘记,就是启动服务器端启动 sshd服务,这样才能执行上面的连接操作
(dir d:\).fullname ,将列出d盘文件夹下的所有目录,并获取全路径名
(dir c:\).name ,使用name 则获取短路径名
get-help dir -full,name 命令名称,syntax 语法,parameters 参数,description 命令详细说明,inputs 输入类型,outputs 输出类型,notes 命令的别名信息,related links 相关链接。这个显示了命令的详细信息
help dir -full,powershell 支持 help 函数来查询命令的帮助,与get-help不同的是,help函数不会一次将所有的帮助信息显示出来,而是显示完当前页面之后,后面的内容需要你按enter键继续浏览
get-help ✲help✲ ,模糊查询,用于获取一些包含指定参数的命令
[参数标识名 参数值] ,在 powershell中,凡是以[]中括号括起来的参数都是可选参数,在下面这张图片中我们看到的参数标识 和 参数值外面又嵌套了一个中括号[]其表示这个整体都是可以选择的,我们会发现一些getxxx的这类[]可选参数较多,大多数不需要填写任何参数就能够成功执行,以start开头的则比较少是因为你必须要传递至少一个参数
powershell的参数分为 [整体可选],[参数标识名可选 参数值必选],[参数标识名必选 参数名必选],[开关参数可选],具体见下图
get-help dir -showwindow 可以弹出一个窗口显示指定命令的详细帮助
在弹出的命令帮助的右上角我们可以通过点击 设置 按钮,选择要显示的帮助部分,我这里是选择了全部
get-help get-help -detailed -example -full -online -showwindow,这个命令不能够直接执行,分别是获取帮助文档的细节、示例、全部、在线、显示窗口帮助文档
get-command|out-gridview ,我个人使用powershell比较喜欢这种输出方式,弹出来一个界面,然后可以对命令进行筛选,比较直观
get-help ✲about✲ ,我想谈一谈关于powershell的about系列的命令,关于xxx的帮助文档更加的有意思,有了很多延伸的扩展,没事的时候大家都可以去看一看,有很多命令的延伸
get-help about_Aliases -showwindow about关于系列的命令 如下所示,我们可以看到其中的一些帮助信息
update-help -erroraction silentlycontinue,update-help -UICulture cn-zh -ErrorAction SilentlyContinue,通常我们都是直接使用 update-help 来更新本地的帮助文件,但当出现一些错误的时候,就会停止更新,后面的-erroraction参数指明了当出现错误时的操作 为静默继续更新,第二个命令则指定了更新的语言为中文,英文则为en_US
psprovider,get-psprovider,psdrive,get-psdrive,看似四个命令实际两个命令,psprovider 用于获取命令的一些分类信息,psdrive用于获取powershell支持的驱动器,dir可遍历的。psprovider中的shouldprocess 类型的命令支持 -whatif -confirm开关参数,Credentials则需要凭证,Filter是支持过滤的意思,Transaction主要用于事务提交 回滚
dir alias:;dir cert:;dir cert: -recurse;dir env:;dir function:;dir wsman:;dir variable:;dir HKCU:;dir HKLM:; ,下图中展示了这些命令的执行结果
get-command ✲start-✲ ,在powershell中 ✲ 星号符的意思是通配符,可以匹配任意字符任意次,我们只需指定命令字符串中的一部分就能够获取包含指定字符串的内容
get-location pwd gl,通过get-location 我们可以获取当前路径,这个类似于批处理中的百分比号引用的 cd ,以及linux中的pwd,当然在powershell中我们也可以使用pwd
cd hkcu:我么可以通过cd命令直接进入注册表中,这里的cd命令其实就是set-location
get-itemproperty hkcu:可以获取项相关的属性信息,这里获取的是注册表键相关的信息,比如HKCU的全写其实就是 HKEY_CURRENT_USER,如果是盘符路径的话又是别的显示方式了
get-help set-itemproperty -example ,考虑到使用这个命令的机会比较少,我做一个简单的介绍,set-itemproperty 主要用于修改文件夹 文件 注册表项的属性值
(dir NuGet -r).FullName ,此命令将获取包含nuget的所有路径名,并最终以绝对路径名的方式显示出来,这里的-r 代表的是 -recurse 遍历的意思
get-service|sort-object DisplayName ,我们通过powershell get-service得到的命令,其实与services.msc面板中的服务名称一样,只不过我们使用sort-object 排序得到的结果是汉字服务名在上,英文服务名在下
$content = get-content 1.txt,将从1.txt 获取所有内容,并赋值给$content 这个变量
new-alias hp get-help ,来谈一谈new-alias 这个命令,这是一个创建新的别名的命令,需要注意的是参数 new-alias 新的名称 后面是系统的原始命令
get-member -inputobject $sArr ,这个命令将获取数组的成员方法和属性,平时我们通过管道符传递对象,每次只能传递数组或者List中的一个对象(忽略重复的相同的对象),这就导致获取的是数组或者list中对象类型的成员方法和属性,而非数组或者list本身的成员方法和属性
,$sArr|gm 和 ,(1,2,3)|gm ,基于这个原理,我们也可以使用一种别致的形式将整个数组作为数组中的一个对象通过管道符传递给get-member ,以此来获取数组或者List等数据类型的正确的成员方法和属性
get-help ✲about✲ 和 get-help about_Comparison_Operators -showwindow ,首先我们获取比较操作符相关的命令,然后以showwindow的方式显示出来
-eq 等于 -le 小于等于 -lt 小于 -gt 大于 -ge 大于等于 -ne 不等于 -eq 等于(不区分大小写) -ieq 等于 (不区分大小写) -ceq(区分大小写) ieq 和 eq 一样 ,前面加i的和没加的一样,加c的都是区分大小写的
get-help ✲about✲script✲ 和 get-help about_Script_Blocks -showwindow ,script_blocks 脚本块,同样我们这里以get-help的方式获取script_blocks的帮助
$commands={echo 1;echo 2;echo 3} 和 $commands 和 &$commands ,在脚本块中的语句用分号;隔开,当你回车的时候只显示语句,并没有执行,如果要执行,我们在变量前面加上 and & 连接符来调用即可
get-module -listAvailable|where {$_ -like "✲selenium✲"} 用于在本地查找模块 ,find-module ✲selenium✲ 用于在互联网 准确的来说是在powershellgallery这个网站查找模块
find-module -allversions selenium 可以查找当前指定的模块的所有版本,有一些beta版本在显示出来的时候可能会格式化错误
当我们将模块安装好之后,是可以直接使用里面的命令的,而无需再使用import-module 这个命令。这张图中先是使用get-module 查看当前powershell窗口会话加载了那些模块,然后直接了selenium模块中的命令打开浏览器,再使用get-module会发现selenium模块已经加载
remove-module selnium 将会从当前powershell窗口会话中移除 slenium模块,但是说实话这个过程其实没有什么意义,import-module以及remove-module就我现在的感觉而言没有使用的价值,因为现在的模块命令都是用到即加载的,非常的动态,因此这两个命令也就显的多余了
install-module -name xmysql ,就比如说我们安装这个xmysql吧,使用instal-module -name 的方式进行安装 ,输入A ,它就会自动下载安装
update-module这个命令有三种返回结果,一种是没有新版本,那就是没有任何提示,一种是非install-module安装的,提示你不能更新,一种是有新版本,会提示你是否进行更新yes no 等选项供你选择
uninstall-module xmysql powershell 删除模块的方式也非常简单,直接一行命令即可,卸载完毕后也不会有任何提示,总的来看powershell对于module的操作都挺直观的。另外uninstall-module 支持同时删除多个模块,module名之间用逗号分隔开即可
get-help ✲about✲module✲ 和 help ✲about✲module✲ 我是不推荐大家使用help的,help命令在powershell中是一个函数,不是一个正经命令,使用起来经常出现一些莫名奇妙的问题,建议全部使用get-help这个命令 来查询帮助
foreach foreach-object 首先需要说明的是foreach 不是powershell的语法,这非常重要,很多人将它当做for使用,但他实际是一个命令。而像for if switch 这些都是powershell的语法
get-help foreach -showwindow ,foreach的帮助真的让人很迷惑,因为通篇都是接收管道符传递对象使用foreach语句进行遍历的方式。全篇没有提到foreach的正常模式,即Foreach($<item> in $<collection>){Statement-1;Statement-2;Statement-N } ,并且在互联网上也没有找到相关信息,这让我一度以为穿越了。。
这张图详展现了powershell foreach的准确用法,对于管道符而言,更像是foreach 和 $_ 的配合,$_不像是一个全部的集合,而是每次传递一个对象供scriptblock使用
read-host write-host write-output,write-output "nihaoshijie"|select length 和 write-output "nihaoshijie"|where {$_.length -lt 10} ,write-host不会传递对象,而是直接将内容输出到控制台,write-output不受这个限制,可以使用管道符
ps notepad|kill ,这个命令的全写是get-process notepadstop-process ,它可以获取所有进程名为notepad的进程,然后通过管道符传递给stop-process 并一个一个将其全部终止
dir|gm|where {$_.membertype -like "Property"}|select Name -unique|foreach {$str =$_.name + "," + $str} ,此命令将获取dir输出文件以及文件夹信息的所有属性,主要为format-table 以及 format-list 等命令提供属性名信息
dir|format-table -property Root,Parent,Name,LastWriteTimeUtc,LastWriteTime,LastAccessTimeUtc,LastAccessTime,FullName,Extension,Exists,CreationTimeUtc,CreationTime,Attributes,Length,IsReadOnly,DirectoryName,Directory -autosize -groupby name
在上面那张图里面我们只给出了所有的命令,这里我们来探讨一下,-wrap 和 -groupby ,wrap 会显示所有的内容,如果最后无法显示的将会另起一行继续显示。groupby name 则会以指定的属性对路径进行分组
在这张新的命令图中,我们没有指定 -warp 得到的输出是 ... 也就是说屏幕放不下的内容以省略号进行了替代
我们右键窗口属性,进入布局 屏幕缓冲区大小,将宽度由300调整为360,然后重新执行命令会发现内容可以显示完全了,并且有了多余的空间
format-table 实际重要的参数 就是四个 -property 执行要显示的,格式化的属性信息,这个可以通过gm以及select where来获取,-autosize将显示的长度大小自动控制在等宽的列长度中,得到的输出更加紧凑,以显示更多的信息,-groupby 和 -wrap已经讲过不再重复
dir|format-table -property FullName,CreationTime,@{name="size(kb)";expression={$size = $_.length1kb -as [int];if($size -gt 1024){echo (($size1024 -as [int]).toString()+" mb")} else {echo ($size.toString()+" kb")}}}自动匹配文件大小kb mb
powershell 哈希表的定义
powershell 脚本执行策略种类 分为 allsigned remotesigned restricted 不允许执行任何脚本 unrestricted 可以运行所有脚本 bypass 忽略配置好的
在组策略中我们我们可以一次 点开 计算机配置 管理模板 windows组件 windowspowershell 来启用脚本执行
我们在组策略中看到的windowspowershell 未配置 其实在powershell 中通过 get-executionpolicy -list 获取的就是 undefine 未定义