认识windows的两个命令行工具 CMD命令提示符和PowerShell

都可以用于人机交互并提供一个用于自动化IT的提示工具,pws扩展cmd shell的功能(微软发明了一种叫ALIAS别名的机制比如CMD的cd功能和pws的Get-Location一样,可以在powershell中输入Get-Alias命令查看所有的别名关系,这其中也吸纳了一些linux命令),可以运行称为cmdlet的pws命令,可以在pws中运行windows命令和pws专属的cmdlet命令,但是cmd shell只允许运行windows命令

cmdlet是啥

cmdlet = PowerShell 里的“小命令”

  1. 先分清楚 3 个东西

你现在只要记住这个区别就行:

  1. cmd 里的叫:命令
  • dir、cd、copy、del…
  • 老系统里的小指令
  1. Linux 里的叫:程序/命令
  • ls、cd、cp、rm…
  1. PowerShell 里的叫:cmdlet(命令小部件)
  • 这就是你问的东西
  1. cmdlet 长啥样?

    格式固定:

    动词-名词

    比如:

    • Get-ChildItem (获取文件列表 = dir / ls)
    • Set-Location (设置位置 = cd)
    • New-Item (新建文件/文件夹)
    • Remove-Item (删除 = del / rm)
    • Copy-Item (复制 = copy / cp)
  2. 为什么要有 cmdlet?

因为 PowerShell 是现代、正规、系统化的 Shell:

  • 所有命令格式统一
  • 好记、好查、好自动补全
  • 功能比 cmd 强得多

但——
你不用背全名!
PowerShell 做了别名,你可以直接敲:

  • ls
  • dir
  • cd
  • mkdir
  • rm
  • cp
  • mv

它内部会自动翻译成对应的 cmdlet。

4.超级精简总结

  • cmdlet = PowerShell 的官方命令
  • 格式:动词-名词
  • 但你不用记全名,直接用 ls / cd / mkdir / rm 就行
  • 它和 cmd、Linux 命令功能一样,只是名字更规范

内置命令和批处理文件是什么

内置命令:CMD自己自带,不用找别的文件就能直接用的命令

外部命令:不是自带,本质是一个.exe可执行文件 eg:ping,ipconfig,format 用的时候再查

批处理(batch)文件:把一堆CMD命令写在一个文本文件里,后缀改成.bat,双击就能自动全部执行

即把命令打包成一个一键脚本

pws和cmd的区别

cmd:纯文本命令解释器

pws:面向对象的脚本环境+命令行

功能差距(核心区别)

CMD 能做的:

  • 基础文件操作: dir / cd / copy / del / mkdir

  • 运行简单 .bat 批处理脚本

  • 调用外部 exe(如 ping / ipconfig )

  • 几乎不支持变量、循环、逻辑判断

  • 通常返回纯文本的输出

PowerShell 能做的:

  • 上面 CMD 所有功能(完全兼容)

  • 管理 Windows 全系统:服务、进程、注册表、用户、权限

  • 写复杂脚本 .ps1 ,支持变量、循环、条件判断、函数

  • 面向对象:命令输出是“对象”,可以筛选、排序、管道传递

  • 强大的自动补全(Tab 键)、模块扩展

  • 直接和 .NET / C# 交互,能做编程级自动化

  • 返回的是.NET对象,允许更复杂和精确的数据操作

脚本文件格式

  • CMD: .bat / .cmd 批处理文件

  • PowerShell: .ps1 脚本文件

  • .ps1 功能远强于 .bat ,但 PowerShell 默认有执行策略,会阻止陌生脚本运行(你之前看到的 npm 报错就是这个原因)

powershell基础命令

任务powershell命令对应linux bash命令作用
看当前目录pwdpwdprint working directory(目录)
列出文件ls/dir/Get-ChildItemlsList,看这个文件夹里有啥
进入目录cd 文件夹名cd 文件夹名Change Directory 换个地方
回到上级cd …cd …回到上一层文件夹
创建文件夹mkdir 文件夹名 /New-Item-ItemTypeDirectory-Name …mkdir 文件夹名Make Directory
创建文件New-Item 文件名.txttouch 文件名.txt新建一个空文件
查看文件内容cat 文件名.txt/Get-Contentcat 文件名.txt看文件里写了啥
删除文件Remove-Item 文件名.txt/delrm 文件名.txtDelete
复制文件Copy-Item 源 目标/copycp 源 目标Copy
移动/重命名Move-Item 源 目标/movemv 源 目标Move/Rename

CMD 最核心 10 个命令:

  • dir 看文件

  • cd 进文件夹

  • cd … 退回去

  • mkdir 新建文件夹

  • echo … > 文件 新建文件

  • type 看内容

  • copy 复制

  • move 改名/移动

  • del 删除

  • cls 清屏


2.管道符 |

可以连接多个命令,把左边命令的输出丢给右边命令当输入,在 PowerShell 中,管道符 | 前后加不加空格都可以运行

接下来给几个命令

eg1:想获取5个CPU占用率最高的进程

Get-Process|Sort-Object CPU -Descending|Select-Object -First 5

获取进程|排序+排序依据(CPU占用时间)|筛选前五个

eg2:计算windows目录下面所有exe可执行文件的大小

Get-ChildItem $env:windir -Filter *.exe|Measure-Object -Sum Length
  • $env:windir 指定要搜索的目录为 Windows 目录。
  • -Filter *.exe 筛选出所有扩展名为 .exe 的文件。
  • | Measure-Object -Sum Length 通过管道将文件对象传递给 Measure-Object,计算其 Length 属性(文件大小)的总和。

PS:由于主播犯了两个错误,这里说一下

  • 这个美元符号需要在英文输入法模式下输入
  • $env:windir之间不能加空格,
什么是 $env:windir?

你可以把 Windows 系统想象成一个大型的文件柜,里面有很多重要的文件夹。其中一个最重要的文件夹叫 Windows,它通常位于 C:\Windows。

为了方便系统(和用户)快速找到这个文件夹,Windows 在启动时就会记下这个路径,并给它起了一个名字,这个名字就叫 环境变量。windir 就是专门用来存储 Windows 目录路径 的那个环境变量的名字。

在 PowerShell 中,要使用某个环境变量的值,就需要写成 $env:变量名。

  • $ 符号在 PowerShell 里表示“我是一个变量”。
  • env 是 environment(环境)的缩写,表示“我要去环境变量那个抽屉里找”。
  • : 是分隔符,用来把 env 和具体的变量名(windir)分开。
  • windir 就是那个变量本身的名字。

所以,$env:windir 合在一起,就是告诉 PowerShell:“请把环境变量 windir 里存的那个路径拿出来给我用。” 通常情况下,它拿到的就是 C:\Windows。


为什么要用 $env:windir,而不是直接写 C:\Windows?

因为不是所有电脑的 Windows 都装在 C:\Windows!有些电脑可能装在 D 盘,或者有多个系统。如果直接写死 C:\Windows,万一某个用户电脑的 Windows 在 D 盘,命令就会出错。

而使用 $env:windir,PowerShell 会自动去读取系统记录的正确路径,无论 Windows 装在哪里,都能准确找到。这就像你告诉朋友“去我家”和告诉他具体地址的区别——$env:windir 就是“我家”,不管我搬到哪里,它永远指向我现在的家。


放在整个命令里是什么意思?

现在看eg2的完整命令:

powershell

Get-ChildItem $env:windir -Filter *.exe | Measure-Object -Sum Length

我们一步步拆解:

  1. Get-ChildItem:这是一个命令,意思是“列出文件夹里的所有东西”。
  2. $env:windir:告诉 Get-ChildItem 去哪个文件夹里列东西 —— 就是 Windows 目录。
  3. -Filter \*.exe:加上一个筛选条件,只列出那些扩展名为 .exe 的文件(也就是可执行程序)。
  4. |:管道符,意思是把前面列出来的所有文件,传递给下一个命令处理。
  5. Measure-Object -Sum Length:这个命令负责计算。它会对传过来的每一个文件,读取它的 Length 属性(也就是文件大小),然后把所有文件的大小加起来(-Sum),最后显示总和。

所以整句话就是:“到 Windows 文件夹里,把所有 .exe 文件找出来,然后算出它们一共占了多少字节。”


总结
  • $env:windir 是一个“万能钥匙”,自动指向你电脑上的 Windows 文件夹。

  • 以后你在 PowerShell 里看到 $env:XXX,就知道这是在引用某个系统预存的路径或信息(比如 $env:TEMP 是临时文件夹,$env:USERNAME 是当前用户名)。

    eg3:假设有一个

eg3:假设有一个data.csv文件,里面存储了用户信息

Import-Csv data.csv | Where-Object { $_.Age -gt 30 } | ConvertTo-Html | Out-File output.html

1.Import-Csv data.csv

读取 data.csv 文件。
前提条件:你的 CSV 文件第一行必须是表头(例如:Name,Age,Email),否则 $_ .Age 会找不到列。

2.Where-Object

筛选对象

3.{ $_.Age -gt 30 }

筛选条件

$_ 代表当前行的数据。
.Age 取这一行的 “Age” 列的值。
-gt 是 “Greater Than”(大于)的意思。

注意:这里要求 CSV 里的 Age 列必须是数字。如果 CSV 里存的是 “三十” 或者 “30岁”(带文字),这行代码会报错或筛选失败。
4.ConvertTo-Html
把筛选出来的结果转换成 HTML 表格格式。

5.Out-File output.html
把生成的 HTML 内容保存为 output.html 文件。

💡 可能遇到的“坑” (如果运行没结果或报错)
虽然语法没错,但如果运行后没反应,请检查以下两点:
CSV 表头名称:
打开 data.csv,看第一行是不是真的写着 Age?

  • 如果是 年龄,代码就要改成 $_.年龄 -gt 30。
  • 如果是 age (小写),PowerShell 通常不区分大小写,所以没问题,但最好保持一致。
  • 如果有空格,比如 Age (后面有个空格),那就必须写成 $​​​​_. 'Age ’ 。

数据类型:
确保 Age 列里全是纯数字(如 31, 25),不要包含单位(如 31岁)。


CSV 文件(Comma-Separated Values)其实就是一种纯文本格式的表格。

你可以把它想象成 Excel 表格的“简化版”或“通用版”:
长什么样:它没有复杂的颜色、边框或公式,里面只有文字和数字。
怎么分隔:每一列的数据之间用逗号(,)隔开,每一行数据用换行隔开。
为什么用第一行做表头:就像你提到的 Name,Age,Email,第一行是用来告诉电脑“这一列叫什么名字”。如果没有这一行,电脑就不知道哪一列是“年龄”,哪一列是“姓名”,代码里的 $_ .Age 就会因为找不到叫“Age”的列而报错。
举个简单的例子:
假如你有一个 Excel 表格:
表格
姓名 年龄 邮箱
张三 25 mailto:zhangsan@example.com
李四 30 mailto:lisi@example.com
把它保存为 data.csv 后,用记事本打开,它看起来是这样的:
text

编辑

姓名,年龄,邮箱
张三,25,zhangsan@example.com
李四,30,lisi@example.com
第一行 姓名,年龄,邮箱 就是表头。
后面的每一行代表一个人。
中间的逗号 , 就是用来区分不同列的。


由于我们这个例子是基于假设,实践步骤如下

你需要自己新建一个 CSV 文件,并且把它放在正确的位置。别担心,不需要安装任何软件,用电脑自带的记事本就能做。

新建文件并填入内容
  1. 我们需要分两步走:先新建一个文件,再用记事本打开它。

    请按照这个最简单的步骤操作(以在桌面操作为例):

    第一步:新建一个文本文件

    1. 回到电脑桌面(或者你想存放文件的任意文件夹内)。

    2. 在空白处点击鼠标右键。

    3. 在菜单里找到

      “新建” -> 点击 “文本文档”。

      • 这时候你会看到一个叫 新建文本文档.txt 的文件出现了。

    第二步:重命名为 CSV

    1. 选中这个新文件,按键盘上的 F2 键(或者右键点击它选“重命名”)。

    2. 把名字改成

      data.csv
      

      ⚠️ 关键点:一定要把后面的 .txt 删掉,只保留 .csv。

      💡

      如果你看不到 .txt:

      • 说明你的电脑隐藏了后缀名。
      • 解决方法:在文件夹窗口上方点击 “查看” 菜单,勾选 “文件扩展名”。这时候你就能看到 .txt 了,把它删掉改成 .csv 即可。

      系统会弹窗警告“更改扩展名可能导致文件不可用”,直接点 “是”。

      若出现这种情况,说明命名重复了,可以把文件名改成data22.csv或者其他,任意的以.csv为后缀的就行,💡与此同时要把eg3的代码引用的文件名改掉!!!!!!!!!!!(Import-Csv data.csv就这个)

      在这里插入图片描述

    第三步:用记事本打开它

    现在你有了一个叫 data.csv 的文件图标(通常图标会变,或者还是记事本图标)。

    1. 右键点击这个 data.csv 文件。
    2. 选择 “打开方式”。
    3. 在列表里选择 “记事本”。

    第四步:填入内容

    这时候记事本打开了,里面是空白的。请把下面这段代码复制进去:(这是模拟的用户数据):

Name,Age,Email
ZhangSan,25,zhang@example.com
LiSi,35,li@example.com
WangWu,28,wang@example.com
ZhaoLiu,40,zhao@example.com
SunQi,22,sun@example.com

点击记事本左上角的 “文件” -> “保存”,然后关闭记事本。

解释一下刚才的内容:

  • 第一行 Name,Age,Email 就是表头(告诉电脑哪列是年龄)。
  • 后面几行是具体的人,其中 LiSi (35岁) 和 ZhaoLiu (40岁) 的年龄大于 30,待会儿代码运行后,应该只会把这两个人生成到 HTML 里。
把 PowerShell 切换到这个位置

这是新手最容易卡住的地方!代码必须知道文件在哪。

由于我的电脑有WPS,因为 WPS 把自己设为了默认打开方式,但是这不影响代码运行,方法一实践失败了,建议使用方法二,感兴趣的小伙伴可以试试一

**方法一:**找到刚才保存 data.csv 的那个文件夹(比如它在桌面上)。
在这个文件夹的空白处,按住键盘上的 Shift 键不放,同时点击鼠标右键。
在弹出的菜单里,选择 “在此处打开 PowerShell 窗口” (或者 “在终端中打开”)。
这时候会弹出一个黑底或蓝底的窗口,路径应该已经自动指向了这个文件夹。

方法二:

第 1 步:确认文件位置
打开你存放 data.csv 的那个文件夹。(找不到的可以用everything)
点击文件夹顶部的地址栏(就是显示路径的地方,比如 C:\Users\你的名字\Desktop)。
点击后,里面的文字会变成蓝色选中状态。
按键盘 Ctrl + C 复制这个路径。
第 2 步:打开 PowerShell
按键盘上的 Win 键(微软图标那个键),直接输入 powershell。
在搜索结果中点击 “Windows PowerShell” 打开它(会出现一个蓝底或黑底的窗口)。
第 3 步:切换到文件夹
在 PowerShell 窗口里,输入 cd (注意 cd 后面有个空格)+刚才复制的路径

此时命令行看起来应该是这样的:cd C:\Users…\Desktop

💡或者其他,比如主播桌面设置在了D盘,路径就直接是D:\
按 回车键 (Enter)。
✅ 怎么知道成功了?
看 PowerShell 窗口里的路径变了,变成了你刚才复制的那个文件夹路径。
第 4 步:验证文件是否存在(重要!)
在 PowerShell 里输入以下命令并回车:

dir

(这是列出当前文件夹所有文件的命令)

在这里插入图片描述

如果你看到了 data.csv:太棒了!直接进行下一步。
如果你看到的是 data.csv.txt 或者 data.csv 但图标是 WPS:
只要名字是 data.csv 就可以,图标是 WPS 没关系。
如果名字是 data.csv.txt,说明你没改成功后缀名。请输入 ren data.csv.txt data.csv 来重命名。

运行代码

确认文件在列表里后,直接输入eg3那行代码

在这里插入图片描述

回到那个文件夹,你会发现多了一个叫 output.html 的文件。
双击打开它(会用浏览器打开)。

在这里插入图片描述

你应该能看到一个表格,里面只有 LiSi 和 ZhaoLiu 这两个人的信息(因为只有他们年龄大于 30)。

在这里插入图片描述

3.脚本编程

CMD和power shell都可以编写脚本编程语言,扩展名分别是.bat .ps1

区别是.bat文件非常老旧,甚至不支持if嵌套

在这里插入图片描述

powershell更像一个现代版的编程语言,可以使用()和嵌套if来表示代码层级

在这里插入图片描述

cmdlet补充

1.Get-Command命令:可以用来获取所有pws支持的命令

2.Update-Help:用来更新帮助文档

3.Get-Help +一个命令类型 :可以查看单个命令的帮助文档

eg:Get-Help Get-Command

下面几个和Linux完全相同

4.pwd:输出当前的工作目录 是Get-Location的别名

5.ls:列出当前目录的文件

6.clear:用来清屏

7.cat:查看某个文件的内容

8.mkdir:新建一个文件夹

9.mv:移动文件

10.cp:复制文件

11.rm:删除文件

输出命令

12.ps | export -csv -Path test.csv

显示当前所有进程|把某些数据输出到csv格式,回车一下就把所有进程输出到csv里面了

13.ps | convertto-html > test.html

输出html格式的网页可以使用浏览器打开

这里详细例子大家可以上网搜一下,我就不演示了

💡这些常用别名涉及到命令参数的一定要仔细看帮助文档


下面这是个例子,简单讲解一下

在这里插入图片描述

一、先拆解这条命令的含义

cp .\测试2\powershell.ps1 ./

  • cp :在 PowerShell 里是 Copy-Item 的别名,作用是复制文件/文件夹。
  • .\测试2\powershell.ps1 :源文件路径
  • . 代表「当前目录」(你现在所在的 C:\Users\93917\Desktop\测试 )
  • .\测试2\ 代表「当前目录下的「测试2」子文件夹」
  • 合起来就是:当前目录 → 进入「测试2」文件夹 → 找到 powershell.ps1 文件
  • ./ :目标路径
  • ./ 同样代表「当前目录」(也就是你现在的 测试 文件夹)
  • 作用是:把刚才找到的源文件,复制到当前目录

二、为什么要这么写?

  1. 相对路径的规范写法
  • 用 . 开头明确告诉 PowerShell:「我要从当前所在文件夹开始找文件」,避免和系统内置命令/其他路径混淆。
  • 如果直接写 测试2\powershell.ps1 也能运行,但 . 是更严谨、更通用的写法(Linux/macOS 也遵循这套规则)。
  1. 场景还原
    他的文件夹结构大概是这样:
    plaintext

测试/
├─ 测试2/
│ └─ powershell.ps1 ← 要复制的源文件
└─ ./ ← 复制到这里(当前的「测试」文件夹)

这条命令就是把「测试2」里的脚本,复制一份到外层的「测试」文件夹。

三、等价写法对比

写法 说明
cp .\测试2\powershell.ps1 ./ 最清晰的相对路径写法 ✅
cp .\测试2\powershell.ps1 . 末尾的 / 可省略,效果一样
cp 测试2\powershell.ps1 . 省略开头的 . ,也能运行,但不够严谨
Copy-Item .\测试2\powershell.ps1 -Destination ./ 完整的 PowerShell 原生命令写法

四、小提醒

  • 在 PowerShell 里, cp 、 ls 、 rm 其实都是别名,分别对应 Copy-Item 、 Get-ChildItem 、 Remove-Item ,是为了让习惯 Linux 的用户更快上手。
  • 如果你想更“正宗”的 PowerShell 写法,可以用完整命令名,可读性更强。

更多推荐