简单说一下 PowerShell
很早就知道 PowerShell,但是没怎么深入的使用过,平时也还是主要使用 CMD。
最近做项目的时候,需要起不少环境,每次起的时候去复制粘贴命令肯定是不现实的。以前直接写的 bat 脚本,正好能在实践中学习,于是决定切换到 PowerShell。
先放个官方文档:https://learn.microsoft.com/zh-cn/powershell/
到底哪个 PowerShell 是 PowerShell
这也是我没有正式使用前困扰我的问题。
Windows 系统默认会安装 Windows PowerShell、Windows PowerShell ISE 和 Windows PowerShell (x86)。
但是这些都不是我说的 PowerShell,我说的是 PowerShell Core。
最开始的 PowerShell 是针对 Windows 平台开发的,后来的 PowerShell Core 是一个开源版本的 PowerShell,可以在 Windows、macOS 和 Linux 上运行。
是的,PowerShell 是跨平台的。(emm,我在 Mac 上用的 Warp。)
安装
系统自带的并不是我们需要的,所以需要手动安装,运行如下命令:
# 查看可安装的版本,winget 是 Windows 的包管理器,默认就有的
winget search Microsoft.PowerShell
# Output
名称 ID 版本 源
---------------------------------------------------------------
PowerShell Microsoft.PowerShell 7.4.2.0 winget
PowerShell Preview Microsoft.PowerShell.Preview 7.5.0.3 winget
上面的命令会输出当前可安装的正式和预览版,可以使用下面的命令安装对应的版本:
# 使用 ID 安装
winget install --id Microsoft.Powershell --source winget
winget install --id Microsoft.Powershell.Preview --source winget
安装完成后,应用列表中就会出现 PowerShell 7 了。
使用
PowerShell 包含了绝大多数 CMD 命令,基本上是可以从 CMD 平滑迁移过来的。
同时 PowerShell 还提供了大量额外的功能和 cmdlet。这里就不讲概念了,太绕,大白话就是语法更高级,非要说比 CMD 好用,是要看场景的。
使用过程中让我发现了一个一直没有使用的遗憾,PowerShell 是支持命令提示的,这在终端命令中真的是超级体验。
在 Warp 还没有 Windows 版本之前,这应该是我使用 PowerShell 作为默认命令行工具最主要的理由了。
示例
因为我使用 PowerShell 的当前需求场景是快速的启动各种环境,因此这里就以编写一个简单的启动脚本为例。
创建一个 run.sh1
脚本文件,这里是 123 的 1,不是 l。之所以用这个后缀,我查了一下,有一定的历史和技术背景,很普通就不展开了。
在脚本文件中放入如下内容:
Start-Process pwsh.exe -ArgumentList "-NoExit", "-Command", "cd D:\WorkSpace\Moran_Npm;yarn watch"
- Start-Process pwsh.exe:
Start-Process
命令用于启动一个新的进程,启动的是pwsh.exe
,也就是 PowerShell 7。 - -ArgumentList:指定传递给新进程的参数列表。
- -NoExit:设置启动新的 PowerShell 会话后不要退出,而是保持打开状态。
- -Command:指定要在新 PowerShell 会话中执行的命令。
具体的命令内容就不介绍了,打开目录执行命令。
为了更好的说明 PowerShell 的特性,我修改成了下面更结构化的形式:
$package_cmd = @"
cd D:\WorkSpace\Moran_Npm;
yarn watch
"@
$package_arg = @("-NoExit", "-Command", $package_cmd)
Start-Process pwsh.exe -ArgumentList $package_arg
- $package_cmd:定义一个多行字符串
- $package_arg:定义一个数组,将命令放到数组中
- -ArgumentList $package_arg:传递参数数组
$package_arg
给新的进程
我本身也是新手,在初次使用的时候还是很懵逼的。但是实际使用后,确实具备更多的可能性。
以上。