PowerShell--除了CMD你还可以用他追求你想要的Windows

做这篇的目的是这样的,想要完成一些自动化任务,毕竟是电脑嘛,用程序自动完成一些事也是”解决问题”呀,用些蓝蓝的画面自动一直印出文字然後网路就连线了,应用程序就打开了,没有人操作的电脑在自己运行着你设定的任务,这样不是很酷吗?


前言

在上篇我们简单介绍了CMD有BAT脚本可以运行,但他能做到的终究有限,像是键盘操作或是滑鼠点击之类的就不太能单靠他运行,而後来微软推行的powerShell就是一个新而强大的工具,当然,或许自动化任务这些东西用什麽都写什麽都不奇怪的python也做得到,套件绝对是够你用的,写完的.py档也可以用套件打包成.exe档就可以在没有python的地方执行了,但是实际上真的需要用到python吗? 一行行的指令集轻松写写就可以达成目标的小程序,用powerShell我觉得不亏,初学者想简单只为一个目标学习的话,powerShell常常可以让你只学你需要用的部分不用其他基础,这是笔者在这里推荐给大家的原因,对一个自附IDE工具还附教学网站的Windows内建软件,尝试一下,说不定你会喜欢。


PowerShell简介

Windows PowerShell是以.NET Common Language Runtime (CLR)为基础,所有输入和输出都是.NET物件,语法以指令集为基础,自从Win 7开始就已预先安装在Windows里了,Windows 10现在预设安装应该都是5.1版,在开始功能表可以找到,你也可以在里面找到Windows PowerShell ISE,这是Windows PowerShell的整合式指令码环境(IDE),写脚本的时候就不用像bat用记事本打了。如果想检查你的版本可以直接输入$PSVersionTable就会印出详细资料。
Imgur


Cmdlet

PowerShell有个特色是具有所谓的Cmdlet(念做commandlets),也就是他的一种指令集,通常是由动词-名词的形式组成,跟CMD指令一样不分大小写,可以从指令本身大概猜出他的意思,有种需要哪条指令再学哪条指令的的设计模式,通用执行阶段上,采用物件输入并传回物件,例如我们执行Get-Process -Name explorer,这个Get-Process就是一个Cmdlet,他可以获得-程序的资讯,後面接的-Name explorer就是找一个名为explorer的参数选项,所以整句指令传入Windows後会回传一个关於名叫explorer的程序资讯的.NET 框架物件。
Imgur

除此之外,powerShell也相容大部分的DOS指令,意思就是在前面CMD学的指令在这里也可以运行不用舍弃。


变数和物件

PowerShell的变数名称以$作为开头,例如刚刚的$PSVersionTable,如果变数本身也属於物件也可以直接用.去抓取,例如想取得刚刚的$PSVersionTable里的PowerShell版本号内容(PSVersion)可以用$PSVersionTable.PSVersion,这时候你发现他也是一个物件,我们可以试着在往下抓取,输入$PSVersionTable.PSVersion.Majorr就会印出主版本号。
Imgur


测试功能-WhatIf与-Confirm

在指令後面加上-WhatIf,会显示出如果这个指令执行会发生什麽事但不会执行,例如如果要确认停止一个名叫explorer的程序,实际上会作用在哪,我们可以加上-WhatIf去提前知道自己指令跟目标有没有配对正确,不用真的执行。
Imgur

如果在指令後面加上-Confirm则会在指令执行之前询问是否执行,等待输入,同时也会列出-WhatIf的资讯,像我们在debug的next step一样,可以确认後继续或是停止以下动作。
Imgur


指令串接-pipline(管线)

对於多项指令,有时候我们需要对A指令输出的内容继续给B指令接收并执行,这种指令串接我们就叫pipline(管线),用法就是A|B,给个简单范例,Get-Process notepad | Stop-Process会先取得notepad资讯当作一个物件,再用Stop-Process去停止关闭他(不会发出存档提醒喔)。


.PS1脚本

就像CMD有.bat脚本一样,powerShell也有.ps1脚本,可以把你的指令存成一份指令稿,开启就依序执行里面的面命令,可以用在部署或自动化排程之类的,同样的我们可以用记事本打,然後存档副档名改.ps1即可,不过通常我们编辑powerShell的Script有更好的IDE工具--Windows PowerShell ISE,他会帮PowerShell指令标高亮,下方可以直接测试命令,右边可以检查有哪些模组指令可用,可以直接插入编辑器内。
Imgur

那.ps1档通常右键就可以用powerShell开启执行,或是我们直接在powerShell输入档案路径\档名.ps1也可以。

不过第一次使用的人可能会发现,执行後powerShell直接闪退或是完全不会跑,这跟powerShell的执行原则(Execution Policy)有关,我们输入Get-ExecutionPolicy可以看出来预设是Restricted,在这个模式下电脑不接受.ps1档的执行,这是一个保护机制,Windows不希望不懂原理的用户随意执行.ps1档,尤其是来自网路上的,这些可执行档容易被当作病毒四处散播。
Imgur

所以当我们第一次使用可以用系统管理员打开powerShell,输入Set-ExecutionPolicy RemoteSigned把执行原则变更为RemoteSigned模式,在这个模式下,Windows会允许本机电脑上写入的脚本执行,从网路下载的脚本需要需要来自信任发行者的数位签章才可以执行,如果改为Unrestricted模式则会无条件允许所有脚本执行,所以风险较大就不建议大家使用了。
Imgur

话说回来,这个执行原则也是一种设定,我们也可以在登录档找到相关的子键,直接改写登录档也是一种变更方式,他就是下方子键里的ExecutionPolicy(REG_SZ)登录值。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

Imgur

另外我们也可以用Bypass执行原则去针对某个脚本的当次执行绕过限制,加上-ExecutionPolicy Bypass参数就可以,举例来说,如果我们想要从CMD执行一个powerShell脚本就可以用这个指令。

start powershell -ExecutionPolicy Bypass "档案路径\档名.ps1"

这篇文章的目的是希望你对powershell有点兴趣,一行行的指令比起一门程序语言更容易上手也更基础,又通用在所有Windows还可以做自动化任务,如果你用Windows,何不试试写些自己有兴趣的东西呢?

程序始终是为了解决问题,如果你没有问题,就自己生一个出来,像笔者想优化Windows一样,你总是可以一步步往上钻研,就好像一份专题一个报告,不管多早开始准备,不到最後交差的那一刻你总是继续修改你的成品,因为你发现他还可以更好,总是掩不住那股如果可以为什麽不做的贪婪,这就是求知慾,可以永无止尽进步的慾望,如果有天你失去这种感觉,去做件你真心想做的事,找回你目的方向再去工作吧,不要抛弃你内心的天真无邪。

下篇就是最後了,我会做个整理总结,也会实做一支.ps1程序给大家看,在第30天,我要教各位如何用Windows内建功能,天真拼出自动化铁人发文程序!只为达成目的的思考逻辑,完成最天然的小小愿望,带到这个系列的最终主题---妄想对自己的Windows优化兼Debug的工程师,是不是如我所想的很正常,我们下篇见罗~

Imgur

参考资料:
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

>>:  中央状态指挥中心- Vuex [序]

【Day 14】OSM 浅谈 part 2

OSM 我们来看看 开放地图 的介面。 看起来就像是个复杂版的 google map,对吧 OSM ...

[DAY23]安装PGAdmin(01)

直接安装postgres 选择电脑系统,我这边使用win10 按下紫字 选择最新版本 开始安装一直按...

IT 铁人赛 k8s 入门30天 -- day14 K8s Services explained

前言 这篇文章主要来介绍 Service 元件 内容会谈到 Service 的功能与不同种 Serv...

Day 3 - 原型 (2) : 主页元件

设置 先在Figma中建立2个页面(Page), 名字分别为Blog跟Components(元件)。...

# Day4--欸不是,还要再来一遍喔?回圈别闹了

在Swift里面,则有三种的回圈,如下所述: for…in loop while loop 我在思考...