本文基于 PowerShell 3.0
发布
Windows是一个面向API的操作系统
Getting started with PowerShell
一个脚本的平均寿命始于提示符,终结于字符
Cmd + C# + .net = PowerShell
cmdlets construction : Verb + Noun
分号;
可以使多条命令并行输出
Help System in PowerShell
我们并不可能去牢记所有的命令,这不仅仅是存在的cmdlets太多的问题,除非真的可以记住它们(?。。。)
作为一名啃文档症重度患者,查看一件事物的帮助手册是一个很好的解决方案!
以下指令用以获取PowerShell cmdlets的官方文档.
语法:
1 | Get-Help [[-Name] <string>] [<CommonParameters>] |
The Parameter parameter displays only the descriptions of the specified parameters. If you specify only the asterisk (*) wildcard character, it displays the descriptions of all parameters. When Parameter specifies a parameter name such as GroupBy, information about that parameter is shown.
当使用星号(*)
通配符时,若为其指定参数名,ps将列出所有与它相关的 cmdlets:
e.g.
1 | Get-Help *service* |
如果想列出某 cmdlet 的完整文档:
1 | Get-Help [cmdlet] -Detailed |
对于一个cmdlet,使用 -example
参数将显示所有官方给出相关实例。
为了防止工作流混乱,可以使用-showwindow
属性显示一个单独的帮助窗口来查看帮助文档。
关于帮助文档中的语法结构 , 这里有一个概念 位置参数
, 即在参数列表中已经固定位置,不需要再输入形参名来指定参数,直接输入传递参数即可,如以下代码示例:
1 | get-service -name bits |
嘛,其实我还是更习惯在ms官网看这些文档,不过ps确实提供了一条捷径来获取这一帮助,更利于查找所需命令的文档,以下命令可以快速转到线上文档
:
1 | get-help cmdlet -online |
Usage of pipeline
Powershell 中的重要的概念 – 管道
, 简单的说,一组命令中,输出的命令结果将作为下一个命令的参数
执行,
e.g.
1 | get-service | export-csv -path F:\services.csv |
将获取的数据导出到本地:
1 | gal | ConvertTo-Html | Out-File f:\Alias.html |
1 | get-service | stop-service |
所以使用类似这样的命令组之前,可以使用 -whatif
来测试,看看命令组究竟会进行哪些操作。
还可以使用 -confirm
, 不过此参数是告诉 某指令会怎么做(即指令目标target)
和 你是否要这样做
, 注意ps不会为你做出任何选择
+. 若在命令的结尾写上 |
管道符号并 Enter, Powershell 将换行 , 用户可以继续输入命令
Pipeline flow control cmdlet “Where-Object “
`alias:` `?` ; `where`?
是 Where-Object
的别名,它还有另一个别名where
, 主要用于过滤列表项或输出结果
Objects for PowerShell
先来看一组命令:
1 | ps | ? -Property handles -gt 900 | sort handles |
这组命令通过列出所有进程 并给到后面的管道处理 -> 从属性handles中筛选出大于900的 -> 以handles进行排序
这里能够使用属性,因为我们从get-process (ps)
中得到的并不只是文本,实际是获取了一组对象,对象拥有属性和方法(老相识了)
可以使用Get-Member(gm)
查看有哪些属性或方法是可用的
使用Select-Object(select)
来选择查看哪些属性
1 | gal | select Definition,Name |
💡 Terminal Solutions
此标题内容下将记录一些使用终端程序时发现的解决方案。
于 Windows Terminal 中使用 系统环境变量
在添加完环境变量
后使用Windows Terminal 时,使用cd(Set-Location)
无法即时进入目录或打开程序,解决方案即将 Windows Terminal 重启
即可,访问设置的环境变量目录:
1 | Set-Location -Path $env:SystemRoot |
此问题已在 #7239 添加issue-Bug
标签,Merged issue 来自 #7243
若是VSCode 或是 VS 中的终端,与上同理
[New] 关于Windows Terminal 中的权限提升
[Obsoleted] 由于在一个未使用管理员模式的窗口中使用了一个拥有管理员权限的命令行…使应用程序存在安全漏洞,开发团队正在寻找一个安全的解决方案。
已经可以以管理员权限启动WT.
在体验Windows 11 期间 , 我发现Windows Terminal V2.0
已经集成到 Windows 11 且成为默认终端.. Win + x
可见”Windows Terminal (Administrator)”
💡 几个小特性
- 若一个新的终端标签以权限提升启动,则其他存在的标签将转换为同等权限启动.
- 可以使用批处理文件来初始化终端的配置文件
- 从Windows 终端预览版 v1.12.2922.0开始,可以使用 firstWindowPreference全局设置关闭终端会话时保存窗口窗格布局
使用 PowerShell 添加永久的环境变量
更改完毕后重启Windows Terminal 即可生效
基于.NET 5 Environment
类中的 SetEnvironmentVariable
方法
1 | ### Modify a system environment variable ### |
SetEnvironmentVariable(String, String, EnvironmentVariableTarget) - 重载 -
创建、修改或删除当前进程中或者为当前用户或本地计算机保留的 Windows 操作系统注册表项中存储的环境变量。
1 | public static void SetEnvironmentVariable (string variable, string? value, EnvironmentVariableTarget target); |
🎁 Instances IN Practices
Get process ID though port which was occupied
1 | Get-NetTCPConnection -LocalPort 443 | ft LocalPort,OwningProcess |
以上命令将获取占用443端口
的PID
通过pipeline
传递给ft
,将所选属性的结果以表格形式输出
ft
=> Format-Table
删除环境变量
1. Remove-Item
Remove-Item (Alias as del / erase / rd / ri / rm / rmdir)
1 | Remove-Item Env:\MyTestVariable |
2. SetEnvironmentVariable
使用.NET
框架组件 , 将变量值设为$null
1 | [Environment]::SetEnvironmentVariable("MyTestVariable",$null,"User") |