简单说一下 PowerShell

简单说一下 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 给新的进程

我本身也是新手,在初次使用的时候还是很懵逼的。但是实际使用后,确实具备更多的可能性。


以上。