做这篇的目的是这样的,想要完成一些自动化任务,毕竟是电脑嘛,用程序自动完成一些事也是”解决问题”呀,用些蓝蓝的画面自动一直印出文字然後网路就连线了,应用程序就打开了,没有人操作的电脑在自己运行着你设定的任务,这样不是很酷吗?
在上篇我们简单介绍了CMD有BAT脚本可以运行,但他能做到的终究有限,像是键盘操作或是滑鼠点击之类的就不太能单靠他运行,而後来微软推行的powerShell就是一个新而强大的工具,当然,或许自动化任务这些东西用什麽都写什麽都不奇怪的python也做得到,套件绝对是够你用的,写完的.py档也可以用套件打包成.exe档就可以在没有python的地方执行了,但是实际上真的需要用到python吗? 一行行的指令集轻松写写就可以达成目标的小程序,用powerShell我觉得不亏,初学者想简单只为一个目标学习的话,powerShell常常可以让你只学你需要用的部分不用其他基础,这是笔者在这里推荐给大家的原因,对一个自附IDE工具还附教学网站的Windows内建软件,尝试一下,说不定你会喜欢。
Windows PowerShell是以.NET Common Language Runtime (CLR)为基础,所有输入和输出都是.NET物件,语法以指令集为基础,自从Win 7开始就已预先安装在Windows里了,Windows 10现在预设安装应该都是5.1版,在开始功能表可以找到,你也可以在里面找到Windows PowerShell ISE,这是Windows PowerShell的整合式指令码环境(IDE),写脚本的时候就不用像bat用记事本打了。如果想检查你的版本可以直接输入$PSVersionTable
就会印出详细资料。
PowerShell有个特色是具有所谓的Cmdlet(念做commandlets),也就是他的一种指令集,通常是由动词-名词
的形式组成,跟CMD指令一样不分大小写,可以从指令本身大概猜出他的意思,有种需要哪条指令再学哪条指令的的设计模式,通用执行阶段上,采用物件输入并传回物件,例如我们执行Get-Process -Name explorer
,这个Get-Process就是一个Cmdlet,他可以获得-程序的资讯,後面接的-Name explorer就是找一个名为explorer的参数选项,所以整句指令传入Windows後会回传一个关於名叫explorer的程序资讯的.NET 框架物件。
除此之外,powerShell也相容大部分的DOS指令,意思就是在前面CMD学的指令在这里也可以运行不用舍弃。
PowerShell的变数名称以$作为开头,例如刚刚的$PSVersionTable,如果变数本身也属於物件也可以直接用.
去抓取,例如想取得刚刚的$PSVersionTable里的PowerShell版本号内容(PSVersion)可以用$PSVersionTable.PSVersion
,这时候你发现他也是一个物件,我们可以试着在往下抓取,输入$PSVersionTable.PSVersion.Major
r就会印出主版本号。
在指令後面加上-WhatIf,会显示出如果这个指令执行会发生什麽事但不会执行,例如如果要确认停止一个名叫explorer的程序,实际上会作用在哪,我们可以加上-WhatIf去提前知道自己指令跟目标有没有配对正确,不用真的执行。
如果在指令後面加上-Confirm则会在指令执行之前询问是否执行,等待输入,同时也会列出-WhatIf的资讯,像我们在debug的next step一样,可以确认後继续或是停止以下动作。
对於多项指令,有时候我们需要对A指令输出的内容继续给B指令接收并执行,这种指令串接我们就叫pipline(管线),用法就是A|B
,给个简单范例,Get-Process notepad | Stop-Process
会先取得notepad资讯当作一个物件,再用Stop-Process去停止关闭他(不会发出存档提醒喔)。
就像CMD有.bat脚本一样,powerShell也有.ps1脚本,可以把你的指令存成一份指令稿,开启就依序执行里面的面命令,可以用在部署或自动化排程之类的,同样的我们可以用记事本打,然後存档副档名改.ps1
即可,不过通常我们编辑powerShell的Script有更好的IDE工具--Windows PowerShell ISE,他会帮PowerShell指令标高亮,下方可以直接测试命令,右边可以检查有哪些模组指令可用,可以直接插入编辑器内。
那.ps1档通常右键就可以用powerShell开启执行,或是我们直接在powerShell输入档案路径\档名.ps1
也可以。
不过第一次使用的人可能会发现,执行後powerShell直接闪退或是完全不会跑,这跟powerShell的执行原则(Execution Policy)有关,我们输入Get-ExecutionPolicy
可以看出来预设是Restricted,在这个模式下电脑不接受.ps1档的执行,这是一个保护机制,Windows不希望不懂原理的用户随意执行.ps1档,尤其是来自网路上的,这些可执行档容易被当作病毒四处散播。
所以当我们第一次使用可以用系统管理员打开powerShell,输入Set-ExecutionPolicy RemoteSigned
把执行原则变更为RemoteSigned模式,在这个模式下,Windows会允许本机电脑上写入的脚本执行,从网路下载的脚本需要需要来自信任发行者的数位签章才可以执行,如果改为Unrestricted模式则会无条件允许所有脚本执行,所以风险较大就不建议大家使用了。
话说回来,这个执行原则也是一种设定,我们也可以在登录档找到相关的子键,直接改写登录档也是一种变更方式,他就是下方子键里的ExecutionPolicy(REG_SZ)登录值。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
另外我们也可以用Bypass执行原则去针对某个脚本的当次执行绕过限制,加上-ExecutionPolicy Bypass
参数就可以,举例来说,如果我们想要从CMD执行一个powerShell脚本就可以用这个指令。
start powershell -ExecutionPolicy Bypass "档案路径\档名.ps1"
这篇文章的目的是希望你对powershell有点兴趣,一行行的指令比起一门程序语言更容易上手也更基础,又通用在所有Windows还可以做自动化任务,如果你用Windows,何不试试写些自己有兴趣的东西呢?
程序始终是为了解决问题,如果你没有问题,就自己生一个出来,像笔者想优化Windows一样,你总是可以一步步往上钻研,就好像一份专题一个报告,不管多早开始准备,不到最後交差的那一刻你总是继续修改你的成品,因为你发现他还可以更好,总是掩不住那股如果可以为什麽不做的贪婪,这就是求知慾,可以永无止尽进步的慾望,如果有天你失去这种感觉,去做件你真心想做的事,找回你目的方向再去工作吧,不要抛弃你内心的天真无邪。
下篇就是最後了,我会做个整理总结,也会实做一支.ps1程序给大家看,在第30天,我要教各位如何用Windows内建功能,天真拼出自动化铁人发文程序!只为达成目的的思考逻辑,完成最天然的小小愿望,带到这个系列的最终主题---妄想对自己的Windows优化兼Debug的工程师,是不是如我所想的很正常,我们下篇见罗~
参考资料:
https://docs.microsoft.com/zh-tw/learn/browse/?terms=PowerShell
https://officeguide.cc/powershell-beginner-introduction/
https://docs.microsoft.com/zh-tw/archive/blogs/technet_taiwan/windows-powershell
https://ithelp.ithome.com.tw/articles/10027387
https://docs.microsoft.com/zh-tw/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.1
<<: Day22【JS】ES6 动态计算属性名 Computed property names
OSM 我们来看看 开放地图 的介面。 看起来就像是个复杂版的 google map,对吧 OSM ...
直接安装postgres 选择电脑系统,我这边使用win10 按下紫字 选择最新版本 开始安装一直按...
前言 这篇文章主要来介绍 Service 元件 内容会谈到 Service 的功能与不同种 Serv...
设置 先在Figma中建立2个页面(Page), 名字分别为Blog跟Components(元件)。...
在Swift里面,则有三种的回圈,如下所述: for…in loop while loop 我在思考...