Powershell 笔记

本文详细介绍了PowerShell的基础知识,包括Cmdlet、语法、变量、字符串操作、正则表达式以及文件操作等。PowerShell是基于.NET平台的,其命令以Cmdlet形式存在,支持强大的对象交互。文章还探讨了执行策略、文件查询、脚本编写以及调试方法,是学习PowerShell的实用参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Reference

  1. .Net docs
  2. Powershell 教程,很多很详细
  3. Powwershell 实战
  4. powershell基本知识
  5. 一个英文数据库论坛,有powershell资料

Introduction

Powershell和Linux Shell还有一个不同点在于Powershell是基于.NET平台的,它的命令叫做cmdlet。cmdlet功能比普通的Linux命令更强,因为cmdlet接受的参数不是字符串,而是 .NET对象,这使得Powershell 的功能更加强大和灵活。

  • PowerShell将一切存储在对象中,方法&属性很多,很有用.

about c# & .net

C# is an elegant and type-safe object-oriented language that enables developers to build a variety of secure and robust applications that run on the .NET Framework.

Help / mannual

ISE 的自动补全是做得很好的!
敲代码时多试试tab键, 会有意外收获!

  • Get-Command : 别名gcm, 参数在输入“-”后会自动补全。

-noun xxx: 在verb-noun格式中名字,noun部分为xxx的包命令。
gcm 只是简略显示type、alias、version.
gcm 返回的是一个对象,可以善加利用。

如果想要更详细的信息——

gcm ls | fl * # fl: format List
$me = gcm ls
$me.definition

Man get-help

  • Get-help: 别名man
  • command -? 也行。
  • man command -online 可以查看详细手册,注意版本可能不同。
  • get-help online docs

man 指令有很多选项,比如-example -----查看例子; -detailed etc.

  • %有很多内容是.net中的%

command add-on

在ise的右侧有一个"“commands add-on” , 选中模块–name栏检索, 填入参数, 可以点击右下的按钮------run or insert or copy.

比如Microsoft.Powershell.Management 模块中就有很多常用命令.

syntax

  1. powershell syntax
  2. 注释 :行注释符使用井号(#)引起一行;块注释符使用“<#”和 “#>”来引起一段注释。

总体

  1. 别名alias : powershell 别名
ls alias:     # or get-alias, 这里必须有冒号!!
ls alias: | where definition -Match 'item$' # 以item结尾的alias.
ls alias:  | where definition -Match '.*Get-ChildItem.*'

一个命令可能有多个别名(e.g. ls/dir–>get-childitem)

variable

  • 设置变量: $name=value , then use $name
    如果返回的是object,还可以获得属性值(.property) or use pipe.
  • 删除变量: rv name

caution: It’s rv , not rm(terrible!)

字符串

  1. powershell 文本

The escape character of powershell is “`”(left of 1), not /.
@""@定义多行文本.

用户交互:

  1. 输入输出和遍历
  2. 用户交互
  • Read-Host存储的字符串使用的单引号闭合,也就是说不会自动解析变量,不过可以通过ExpandString方法解析
  • 如果想通过Read-Host接受敏感数据,比如密码,可以使用-asSecureString选项

三种方式输入:

  1. 直接输入;
  2. 交互式输入
$in = Read-Host 'Please input something' 
  1. 大量数据 的输入: get-content filename #可以结合pipe。

输出:

  1. 输出到屏幕 write-host ‘string’
  2. 输出到文件 out-file filename
  3. 表格形式输出 out-gridview
Get-ChildItem | Out-GridView  # 会打开一个新窗口,内含表格,可以选择列名。

字符串操作符

“string1” + “string2” = “new string”

operator

  • -match和-notmatch用于正则表达式.

‘aabcc’ -match ‘a*b?c+’
True

  • Powershell 和.NET平台绑定,所以它是一门强类型的脚本。因此我们可以在脚本中判断数据的类型,只要使用-is或-isnot运算符即可,类型需要写到方括号中。这里的类型可以是所有合适的.NET类型
3.14 -is [Double]              # for variable, with a '$'.

+. GetType()函数是.NET Framework中所有对象都有的一个方法,这个方法返回对象的类型。当然这里的对象是.NET中所指的对象——所有的变量都是对象

  • 调用操作符——&

可以理解为“取地址,引用”,调用“string"指向的命令。

$command = "Dir" #将命令存储在变量中:
$command  # 如果直接输出变量,字符串原样输出。
#Dir
& $command #如果使用调用操作符"&",执行命令(不能带参数)
# 使用{}形成一个语句块,可以一次搞定
& {$files=ls;Write-Host "文件数:" $files.Count }

#Invoke-Expression命令的逻辑就是将一条字符串传递给调用操作符
# 这里必须用单引号,不做变量替换;  双引号会变量替换
 Invoke-Expression 'Get-Process | Where-Object { $_.Name -like "e*"}'
  • foreach & foreach_object: 遍历集合元素
$array=7..10
foreach ($n in $array)
{
    $n*$n
}

二者区别: foreach作用在一个集合上(大内存),速度更快;foreach-object是一个个迭代处理,不需要事先得到整个集合.

$_ 代表当前的数据,还可以调用$_的方法.

管道 pipe

Group-object: 指定的属性包含相同值的组对象。

管道的处理是实时的,有两种模式-----顺序模式(slow)& 流模式(fast)。

流模式是指前面的命令处理一组数据,处理完一个马上传给下一命令。
像sort-object这样的命令是顺序模式,

Hash table & 数组 array

  • 如果数组中元素的类型为弱类型,默认可以存储不同类型的值.也可以使用强类型—必须同类 [int[]] $nums=@()

12.1 可自动转为int, 添加"string"就报错.

  • 数组不能删除,不能插入. 你之所以可以这么干,事实上是因为后台新建一个数组再删除原来的.
$generals="张飞","关羽","吕布" #新建数组generals[],注意前面的$
$generals[$generals.Count-1]  #访问最后一个元素
$generals[$generals.Count-1..0] # 逆序输出
$generals[0,3]  #可以输出多个元素,这也是脚本语言的优势,比c/c++/java方便
$generals+="赵云" #增加元素,实际是新建一个数组
$generals = $generals[0..1]+$generals[3] #删除generals[2],这操作够骚

数组可以选择多个元素: $result[0,3,5,12]
数组下标从0开始,可以用-1访问最后一个.
使用@()创建数组(从0开始),@{}创建哈希表,使用哈希表的键访问对应的值。

$stu=@{ Name = "小明";Age="12";sex="男" }   # 注意,这里是分号semicolon
$stu["Name"]    
$stu.keys
$stu.values

hash 哈希

关于hash极其详细讲述

安全性

执行策略

1.official: execution policy

网上的教程很多是不靠谱的,其实官方的文档说得很详细。

  • The execution policy isn’t a security system that restricts user actions. For example, users can easily bypass a policy by typing the script contents at the command line when they cannot run a script. Instead, the execution policy helps users to set basic rules and prevents them from violating them unintentionally
Get-ExecutionPolicy #获取当下策略
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser #设置新策略,需要run powershell as administrator

执行范围: the default scope is localMachine
undefined : 默认restricted.
在这里插入图片描述

The Scope values are listed in precedence order. The policy that takes precedence is effective in the current session, even if a more restrictive policy was set at a lower level of precedence.

具体怎么做?

目前我的理解是可以这么做(更深入研究后也许会修改):

  1. 在不改变默认策略的情况下,还是可以执行脚本的——鼠标选中脚本 文件 》 右键run with powershell , 相当于
PowerShell.exe -File <FileName> -ExecutionPolicy Bypass
  1. 不会改变powershell的执行策略, 即“一次性的”。
  2. 如果你的执行策略是“allsigned”,那还是需要证书。
  1. process scope 只对当前powershell session 有效, 所以
Set-ExecutionPolicy Unrestricted -Scope Process

文件操作

文件系统常用命令

cd 、pwd 、ls , rm,md(新目录)
ni — 创建新文件或目录
rni 或 ren : 重命名文件or路径
输入Get-Command -Noun item就可以看到这些相关命令。

#先用where选出需要重命名的文件,然后交给foreach-object
Dir | Where-Object { $_.Name -contains "-x86" } | ForEach-Object {
Rename-Item $_.Name $_.Name.replace("-x86", "") }

批量重命名文件

文件查询

访问文件和目录
存储在windows中的特殊目录 & 构造拆分目录

 Get-ChildItem|Where-Object {$_ -match '\w*.md$' -and $_.Length/1kb -gt 5}
  # $_是形式变量,代表每次迭代的文件
 Get-ChildItem | ? name -Match '.*.bat$'  #  这里”name“是”属性“。
#会同时列出PowerShell根目录下的PowerShell脚本和Windows根目录下的所有日志文件。
 Dir $pshome\*.ps1, $env:windir\*.log
#include-exclude  , filter .  filter作用和include类似,但是filter用于简单模式匹配 且效率更高,而include用于RE,内部实现更加复杂
Dir $home -recurse -include *.bmp,*.png,*.jpg, *.gif  #-include可以跟一个数组

查找大于5kb的所有.md格式文件
get-childitem: 显示 当前文件夹下所有文件;
where-object: 简写为“where 或 ?”

  • scriptblock and statement syntax are equivalent

get-childitem 还可以递归、指定递归深度。

-recurse -depth

  • 以树形显示文件结构 tree.

tree 是个application, 所以用"man tree"没有它的信息, 用gcm tree 可见.

但是可以在cmd中通过“help tree” 获得帮助

TREE [drive:][path] [/F] [/A]
/F Display the names of the files in each folder.
/A Use ASCII instead of extended characters.

默认是只显示文件夹。

tree . /f   # e.g.,当前目录下所有文件和directories.
  • 获得文件详细信息:
get-item filename |get-member       
# 这样用:
$info = get-item filename 
$info.lastAccessTime

文件IO

使用 gcm -Noun content .

get-content命令获取文件内容,他是逐行读取,然后一行一行传递给管道,结合select-object和select-string使用.

获取文件内容

Import-Csv, 第一行被解析成列的标题.

脚本

要想执行脚本需要修改执行策略,涉及安全问题。如果你不知道自己在做什么,就不要动。对多数人而言,命令行就可以了。其实包括linux环境,对多数研发来讲,你又不是运维,用不着多复杂的脚本。

以前学习shell可认真了,各种语法各种细节,勤奋得把自己都感动了,可是后来发现就没用到过~
需求是最好的动力

  1. 编写和运行脚本
  • 可以重定向到脚本 ‘“Hello,Powershell Script”’ > MyScript.ps1
  • 使用@‘xxxxxxxx’@括起来
  • 后缀名为什么是.ps1? 据说是因为.ps已经被photoshop抢占了~~
  1. 像执行一个命令一样执行一个脚本,不用输入脚本的相对路径或者绝对路径,甚至*.ps1扩展名。那就将脚本的执行语句保存为别名吧:

Set-Alias Invok-MyScript .MyScript.ps1

  1. 权限问题
    Start-Process powershell -Verb runAs # 管理员权限
    Powershell一般初始化情况下都会禁止脚本执行。

正则regular-expression

通配

在这里插入图片描述

RE由三个主要部分:字符,定位符,限定符(量词)

默认贪婪模式(最大字符串匹配原则),限定符后跟一个问号?就表示非贪婪模式(尝试匹配最短字符串).

或: (a|b)?

可以在变量 m a t c h e s 找 出 返 回 的 结 果 , 使 用 − m a t c h 操 作 符 时 , matches找出返回的结果,使用-match操作符时, matches,使matchmatches变量会自动被创建,并存储过滤出的结果。$matches是一个哈希表.
但是-match只匹配一个,成功即退出,要想匹配多个必须切换至RegEx对象,Regex对象默认是大小写敏感的.

大小写: 默认对大小写不敏感, 可以通过-cmatch 改为敏感; 如果只要正则式的一部分对大小写敏感,可以使用?i -----跟在“(?i)”结构后的字符大小写不敏感,跟在(?-i)结构后面的字符大小写敏感

# 验证是否合法E-mail
$regex = [regex]"(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b"
# 匹配首尾两个
$regex.Matches("hibwj@sina.com 1@com d@c.com")

-match [regex] 大小写敏感

-replace : 替换操作符.

测试

#测试命令执行时间
(Measure-Command {Dir $home -filter *.ps1 -recurse}).TotalSeconds
4,6830099
(Measure-Command {Dir $home -include *.ps1 -recurse}).TotalSeconds
28,1017376

其它相关背景知识

Debug

写程序,当然离不开调试.

官方资料永远最权威–How to debug script in powershell ISE

  • 调试中查看变量:
    In the Script Pane, hover over the variable to display its value as a tool tip.(骚操作~~~)
    In the Console Pane, type the variable name and press ENTER.
  • To display the values of automatic variables:
    In the script, assign the value of the automatic variable to a new variable.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值