时效性
本篇撰写时间为2021.12.18,由于计算机技术日新月异,博客中所有内容都有时效和版本限制,具体做法不一定总行得通,链接可能改动失效,各种软件的用法可能有修改。但是其中透露的思想往往是值得学习的。
Windows 10家庭中文版,版本20H2,操作系统内部版本19042.1348

Shell和PowerShell

为什么需要Shell?

操作系统都有内核kernel,不能随便动。那用户又要使用内核,怎么办呢?通过“外壳”shell就是一种方式
当然,除了shell还有其它程序,它们也可能使用内核
shell除了直接访问内核,也可以调用其它应用程序。
正由于shell方便(以统一的起点)调用其它应用程序或访问内核。相当于乘坐公共交通之前的“开始一公里”(走路等),所以:
使用shell可以高效地自动化操作

PowerShell:很甜很暴力

Windows 10默认有安装PowerShell(在开始菜单搜索)
image
蓝色的两个分别是直接运行PowerShell和以管理员身份运行。绿色的是ISE(集成脚本环境)
我们试着写一个脚本
image
文件-运行,结果输出SecurityError. 原因是系统不信任该脚本(实际上,对于任何不明来源脚本,都应该高度警惕)
于是使用管理员身份运行PS ISE
image
输入Set-Exe已经能看到提示了(这比linux的shell新手友好很多,对吧)
image
根据提示,尝试给当前进程设定策略
image
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
然后写脚本,保存
image
运行输出结果(F5
image

简单自动化

比如一个非常简单的需求:我的桌面只有一堆.lnk快捷方式,其它的文件和文件夹经常是临时放着的一些下载的课件啥的。
我想点击一个脚本,一键把所有除了自身和.lnk之外的所有文件放到指定的一个文件夹,并加上归档时的日期。

尝试交互运行命令

  • 右边问号这里下载帮助
    image
    于是按“显示详细信息”,即可看到帮助
  • 更详细的帮助需要Get-Help <命令> -Online,具体如图
    image
  • Get-Alias dirGet-Alias ls,都输出Get-ChildItem(原名)
    image
  • 尝试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(安全策略和打开方式)

桌面上,保存了这样的脚本文件
image
但是因为没有指定策略,它还不能运行。所以需要管理员PowerShell里
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
现在可以右键 - 使用PowerShell运行了
(这当然有风险了)

  • 为了(可能危险地)允许双击运行,我们可以开始菜单搜索regedit,查找HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command,把取值从image
    改成"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "%1"
    (有人戏称其为PowerShell de-castration hack,可以说非常好笑了)
    想要安全就改回来

于是我们有了可以双击运行的一键整理小脚本
注:这个所谓的hack(StackOverflow原文如此)看起来就是改打开方式

总结和问答练习

  1. Q: 为什么各种shell都最擅长和字符串打交道?
    A: shell是开始一公里,最和人相关,人最想读写字符串