时效性
本篇撰写时间为2021.12.18,由于计算机技术日新月异,博客中所有内容都有时效和版本限制,具体做法不一定总行得通,链接可能改动失效,各种软件的用法可能有修改。但是其中透露的思想往往是值得学习的。
Windows 10家庭中文版,版本20H2,操作系统内部版本19042.1348
Shell和PowerShell
为什么需要Shell?
操作系统都有内核kernel,不能随便动。那用户又要使用内核,怎么办呢?通过“外壳”shell就是一种方式
当然,除了shell还有其它程序,它们也可能使用内核
shell除了直接访问内核,也可以调用其它应用程序。
正由于shell方便(以统一的起点)调用其它应用程序或访问内核。相当于乘坐公共交通之前的“开始一公里”(走路等),所以:
使用shell可以高效地自动化操作
PowerShell:很甜很暴力
Windows 10默认有安装PowerShell(在开始菜单搜索)
蓝色的两个分别是直接运行PowerShell和以管理员身份运行。绿色的是ISE(集成脚本环境)
我们试着写一个脚本
文件-运行,结果输出SecurityError
. 原因是系统不信任该脚本(实际上,对于任何不明来源脚本,都应该高度警惕)
于是使用管理员身份运行PS ISE
输入Set-Exe
已经能看到提示了(这比linux的shell新手友好很多,对吧)
根据提示,尝试给当前进程设定策略
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
然后写脚本,保存
运行输出结果(F5
)
简单自动化
比如一个非常简单的需求:我的桌面只有一堆.lnk
快捷方式,其它的文件和文件夹经常是临时放着的一些下载的课件啥的。
我想点击一个脚本,一键把所有除了自身和.lnk
之外的所有文件放到指定的一个文件夹,并加上归档时的日期。
尝试交互运行命令
- 右边问号这里下载帮助
于是按“显示详细信息”,即可看到帮助 - 更详细的帮助需要
Get-Help <命令> -Online
,具体如图
Get-Alias dir
,Get-Alias ls
,都输出Get-ChildItem
(原名)
- 尝试
foreach($f in ls){echo $f}
- 尝试
foreach($f in ls -Exclude *.lnk){echo $f}
- 尝试
Get-Date -Format 'yymmdd'
- 尝试
'{0}_{1}' -f 1,2
(使用了格式串)
编写脚本
cd C:\Users\<你的用户名>\Desktop
foreach($file in ls -Exclude *.lnk,PutAway.ps1)
{
$fileName = $file.Name
echo "Putting Away $fileName ..."
$dateString = Get-Date -Format 'yyMMdd'
$newName = '{0}_{1}' -f $dateString, $fileName
Rename-Item $file -NewName $newName
mv $newName E:\temp # 这是我自己习惯的地址
}
sleep 2
"de-castration" hack(安全策略和打开方式)
桌面上,保存了这样的脚本文件
但是因为没有指定策略,它还不能运行。所以需要管理员PowerShell里
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
现在可以右键 - 使用PowerShell运行了
(这当然有风险了)
- 为了(可能危险地)允许双击运行,我们可以开始菜单搜索
regedit
,查找HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command
,把取值从
改成"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "%1"
(有人戏称其为PowerShell de-castration hack,可以说非常好笑了)
想要安全就改回来
于是我们有了可以双击运行的一键整理小脚本
注:这个所谓的hack(StackOverflow原文如此)看起来就是改打开方式
总结和问答练习
- Q: 为什么各种shell都最擅长和字符串打交道?
A: shell是开始一公里,最和人相关,人最想读写字符串