查看: 394|回复: 3

PowerShell 7实用技巧:共享配置、命令别名与端口排查

[复制链接]
发表于 昨天 15:00 | 显示全部楼层 |阅读模式
在 Windows 上把 PowerShell 升级到 7 之后,很多习惯 Linux 命令行的开发者会发现,PowerShell 既能兼容常见的 Bash 操作,又自带一套更强大的对象管理能力。如果同时搭配 Windows Terminal 使用,多 Shell 切换和日常运维会顺手很多。这里整理一些实际开发中高频用到的 PowerShell 用法,重点放在配置复用、命令映射和端口排查上。

共享配置是让 Windows PowerShell 5.1 和 PowerShell 7 保持一致的关键。PowerShell 启动时会自动加载 $PROFILE 指定的脚本,但不同版本对应的 $PROFILE 路径并不一样,如果每个版本单独维护配置,改动起来非常麻烦。更推荐的做法是建立一个 shared-profile.ps1,在两个版本的 $PROFILE 中都通过 dot-sourcing 方式加载它。具体就是在 PS5 和 PS7 的 $PROFILE 文件里写一行:
  1. . "$HOME\Documents\PowerShell\shared-profile.ps1"
复制代码

这样以后只需要维护 shared-profile.ps1 这一个文件,PS5 和 PS7 都会应用其中定义的函数、别名和环境变量。

终端切换方面,Windows Terminal 本身只是终端窗口,里面可以跑 cmd、Windows PowerShell 5.1、PowerShell 7、Git Bash、WSL2 等。频繁开新窗口没有必要,直接在当前 Shell 里输入对应命令即可。比如从 PowerShell 进入 CMD 就输入 cmd,退出用 exit;从 CMD 进入 PS5 是 powershell,进入 PS7 是 pwsh;PS5 和 PS7 之间直接输对方命令名就行。如果常用 Git Bash,可以自定义一个函数快速进入:
  1. function git-bash { & "D:\Git\bin\bash.exe" --login -i }
复制代码

这样在 PowerShell 里输入 git-bash 就能直接切到 Git Bash。类似的,wsl 和 wsl -d Ubuntu 可以进入 WSL 或指定发行版。记住 exit 总是返回上一层。

PowerShell 7 默认启用了 PSReadLine 的命令预测功能,输入命令时会出现灰色预测内容。如果不喜欢这种提示,可以在共享配置里加入一行:
  1. Set-PSReadLineOption -PredictionSource None
复制代码

这样每次启动 PS5/PS7 都会自动关闭预测。

关于历史记录,PowerShell 里的历史分为两部分:当前会话历史(Session History)和 PSReadLine 的持久化历史(Persistent History)。Clear-History 只清当前会话,并不会删除磁盘上保存的历史。要彻底清理,需要先找到 PSReadLine 的历史文件路径,然后删除它:
  1. (Get-PSReadLineOption).HistorySavePath | Remove-Item -ErrorAction SilentlyContinue
复制代码

如果想一次完成清屏、清会话历史、删持久化历史,可以定义这样一个函数:
  1. function Clear-All {
  2.     Clear-Host
  3.     Clear-History
  4.     (Get-PSReadLineOption).HistorySavePath | Remove-Item -ErrorAction SilentlyContinue
  5. }
  6. Set-Alias cla Clear-All
复制代码

之后在终端里输入 cla 就可以全部清理干净。

对于从 Linux 过来的开发者,PowerShell 提供了大量与 Bash 对应的命令别名。查看当前路径可以用 pwd 或 Get-Location;列目录用 ls 或 Get-ChildItem;切换目录用 cd;查看文件内容用 cat 或 Get-Content。显示文件前 20 行用 Get-Content file.txt -Head 20,后 20 行用 -Tail 20,实时跟踪日志用 Get-Content app.log -Tail 50 -Wait,相当于 tail -f。复制文件用 cp / Copy-Item,移动重命名用 mv / Move-Item,删除用 rm / Remove-Item,递归删除加 -Recurse,创建目录用 mkdir 或 New-Item -ItemType Directory。查看进程直接 ps,强杀进程用 Stop-Process -Name python 或 Stop-Process -Id 1234 -Force。文本搜索用 Select-String "error" *.log,递归搜索可以配合 Get-ChildItem -Recurse -File。查找命令路径用 which 并不推荐,PowerShell 里更好用的是 Get-Command python,只看路径用 (Get-Command python).Source,查看所有匹配项用 Get-Command python -All。环境变量方面,$env:PATH 对应 Bash 的 $PATH,也可以直接用 Get-ChildItem Env: 查看所有环境变量。

除了模仿 Linux 命令,PowerShell 特有的命令更值得关注。Get-Command 不仅能找到可执行文件的路径,还能判断一个命令的类型——是 Application、Cmdlet、Function、Alias 还是 Script。比如 Get-Command python 会显示 python.exe,而 Get-Command ll 会显示 Alias。

进程管理方面,Get-Process 可以查看所有进程,支持通配符,比如 Get-Process *chrome*。按 CPU 或内存排序时,可以这样组合:
  1. Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Name, Id, CPU
复制代码

要查看线程,可以用 (Get-Process -Id 1234).Threads,或者统计每个进程的线程数并按数量排序。

网络排查是开发中绕不开的场景。PowerShell 的 Get-NetTCPConnection 相当于 Linux 的 ss 或 netstat。查看所有监听端口:
  1. Get-NetTCPConnection -State Listen
复制代码

查询具体端口(比如 8080)被谁占用:
  1. Get-NetTCPConnection -LocalPort 8080
复制代码

输出里会看到 OwningProcess 字段,这是占用端口的进程 ID。进一步用 Get-Process -Id 拿到进程详情,也可以直接通过管道一起处理:
  1. Get-NetTCPConnection -LocalPort 8080 | ForEach-Object { Get-Process -Id $_.OwningProcess }
复制代码

想测试某个端口是否可连通,比如测试 GitHub 的 443 端口:
  1. Test-NetConnection github.com -Port 443
复制代码

如果本地服务没起来,用 Test-NetConnection localhost -Port 5432 可以判断是端口没监听、防火墙阻拦还是网络不通。Ping 用 Test-Connection google.com -Count 2,DNS 解析用 Resolve-DnsName github.com,路由跟踪用 Test-NetConnection github.com -TraceRoute。

Windows 服务的管理用 Get-Service、Start-Service、Stop-Service、Restart-Service 即可,比如 Restart-Service sshd 就能重启 OpenSSH 服务。

最后,PowerShell 的对象管道是它区别于传统文本 Shell 的核心。如果不确定一个命令输出对象有哪些属性,就用 Get-Member:
  1. Get-Process | Get-Member
复制代码

它会列出所有 Property、Method 和 Member。筛选用 Where-Object,比如只看 CPU 大于 10 的进程:
  1. Get-Process | Where-Object { $_.CPU -gt 10 }
复制代码

选择字段用 Select-Object,排序用 Sort-Object,取前几条加 -First。把这些组合起来,就能完成很多复杂的运维任务。

PowerShell 7 在 Windows 上的体验已经非常接近甚至超越传统 Shell。通过合理的配置共享、命令映射和端口排查技巧,日常开发和系统维护的效率会明显提升。上面提到的这些命令,值得直接放进自己的 shared-profile.ps1 里。
回复

使用道具 举报

发表于 昨天 15:10 | 显示全部楼层

Re: PowerShell 7实用技巧:共享配置、命令别名与端口排查

感谢楼主分享,这些技巧很实用。尤其是共享配置那一块,之前一直为 PS5 和 PS7 的 profile 不同步发愁,用 dot-sourcing 统一管理确实省事。另外 `Get-Content -Tail -Wait` 跟踪日志那段也很顺手。 顺便请教一下,端口排查那里内容好像被截断了,后面是不是还有用 `Get-NetTCPConnection` 找出 PID 再关联进程之类的操作?希望能补完,感激不尽。
回复 支持 反对

使用道具 举报

发表于 昨天 15:10 | 显示全部楼层

Re: PowerShell 7实用技巧:共享配置、命令别名与端口排查

感谢整理!共享配置那个思路确实实用,之前一直烦 PS5 和 PS7 配置不同步,dot-sourcing 一下就省事了。`cla` 清历史也顺手,收藏了。
回复 支持 反对

使用道具 举报

发表于 昨天 15:10 | 显示全部楼层

Re: PowerShell 7实用技巧:共享配置、命令别名与端口排查

感谢分享,这套配置思路很实用。特别是共享 profile 那块,之前我都是 PS5 和 PS7 各改各的,经常改完一边忘了另一边,用 dot-sourcing 统一管理确实省心不少。 另外那个端口排查的命令也很有用,以前我都是 netstat -ano 然后去任务管理器里对 PID,现在用 Get-NetTCPConnection 可以直接看到进程名,方便多了。不过有个小问题想请教一下:如果多个进程都监听同一个端口(比如某些服务会有 IPv4 和 IPv6 分别监听),用 Get-NetTCPConnection 查出来会有多行,这时候怎么快速定位到具体是哪个进程在占用?我有时候会看到一堆 LocalAddress 不同的结果,有点分不清。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-8-12 18:45 , Processed in 0.022008 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部