文章目录
前言
1.PowerShell命令不区分大小写。
2.建议把PowerShell窗口的透明度调到85%。
3.如无特殊情况,以下代码大部分都用别名,如要了解其全名和信息,可用 get-help 命令名 查看。
4.如果文件名字中有空格,则要用引号引起来,其它情况不用。
5.如无特殊说明,文件名必须包含后缀名,可以包含文件路径。
6.PowerShell其内容且十分庞杂,文本主要旨在记录一些常用的PowerShell命令,并对PowerShell脚本相关的知识,做一个简要的记录,帮助读者快速上手PowerShell,因此本文相对简短。后期如果有时间,作者会进行补充。
7.作者能力有限文章难免有勘误,请读者多多包含。
一.快捷键
快捷键 | 描述 |
---|---|
ctrl+L | 清屏 |
左箭头/右箭头 | 向左或向右移动光标,每次移动一个字符的距离 |
ctrl+左箭头/右箭头 | 向左或向右移动光标,每次移动一个单词的距离 |
shirt+左箭头/右箭头 | 向左或向右移动光标,并一个一个选中字符 |
shirt+ctrl+左箭头/右箭头 | 向左或向右移动光标,并一个一个选中单词 |
home/end | 移动光标到命令的开头或结尾 |
shirt+home/end | 选中从光标位置到命令的开头或结尾的所有内容 |
ctrl+home/end | 删除从光标位置到命令的开头或结尾的所有内容 |
上箭头/下箭头 | 切换到上一条或下一条命令 |
ESC | 清空正在输入的命令 |
ctrl+C | 停止正在执行的命令 |
ctrl+Z | 撤销 |
pgup/pgdn | 向上或向下翻页 |
Tab | 自动补齐命令或文件名,多次按下,可去切换结果 |
alt+F7 | 清空历史命令(可用history命令查看历史命令) |
二.符号
2.1 常用符号
符号 | 语法 | 描述 |
---|---|---|
> | 命令 > 文件名 | 用于将结果覆盖到指定文件中 (若指定文件不存在,则新建一个) |
>> | 命令 >> 文件名 | 用于将结果追加到指定文件中 (若指定文件不存在,则新建一个) |
.\ | .\ | 指代当前目录 |
& | &命令 | 表示该命令描述的是一个可执行对象 |
%0 | %0 | 指代自身文件名,不包括后缀名 |
$ | $变量名 | 定义变量 |
` | `要转义的字符 | 反引号,用于在双引号中转移字符,如`n表示换行符号 |
’‘ | ’字符串‘ | 不能调用参数 |
“” | “字符串” | 可以调用参数 |
2.2 条件运算符
符号 | 描述 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-ge | 大于等于 |
-lt | 小于 |
-le | 小于等于 |
-and | 与 |
-or | 或 |
-not | 非 |
-xor | 异或 |
-contantins | 包含于 |
-notcontantins | 不包含于 |
三.常用辅助命令
符号 | 语法 | 描述 |
---|---|---|
cls | 单独使用 | 用于清屏 |
gcm | 单独使用 | 查看所有PowerShell命令,并可通过管道符进行搜索 |
man | man 命令名 | 查看指定命令的详细信息,包括它的别名 |
h | 单独使用 | 查看你近期使用过的命令 |
pwd | 单独使用 | 查看当前的路径 |
exit | 单独使用 | 退出powershellma |
systeminfo | 单独使用 | 查看计算机的详细版本信息 |
$psversiontable | 单独使用 | 查看powershell版本 |
四.信息的筛选
4.1 正则表达式
更详细的知识请看文档:关于正则表达式 - PowerShell | Microsoft Learn
符号 | 语法 | 描述 |
---|---|---|
-match | 字符串 -match 字符串或正则表达式 | 用于匹配指定字符,并返回bool值 (以右边为主) |
[] 和 [^] | ① [abc] 匹配abc ② [^abc] 匹配非abc的字符 ③ [a-z] 匹配a到z的字符 | ① [] 或 [^]用于匹配单个字符, ② ^表示非符号,[]号内放字符集 |
\d 和 \D | 单独使用 | ① \d用于匹配单个十进制数 ② \D用于匹配单个非十进制数 |
\w 和 \W | 单独使用 | ① \w用于匹配单个阿拉伯数字或大小写字母 ② \W用于匹配单个特殊字符 |
点 . | 单独使用 | 通配符,匹配单个任意字符 |
\s 和 \S | 单独使用 | ① \s用于匹配单个空格 ② \S用于匹配单个非空格字符 |
* | 单独使用 | ① 单独使用,用于匹配0个或多个任意字符 ② 不能以*开头,在分组()中也不能以*开头 |
+ | 其它符号+ | 根据上一个元素匹配规则再进行一次或多次如: a+ 即用a匹配多次, [abc]+ 即用[abc]匹配多次 |
? | 其它符号? | 根据上一个元素匹配规则再进行0次或1次如: a? 即用a匹配0次或1次, [abc]? 即用[abc]0次或1次 |
{} | 其它符号{n} 或 {n,} 或 {n,m} n和m为整数 | ① 符号{n}表示,根据符号匹配n次 ② 符号{n,}表示,根据符号匹配至少n次 ③ 符号{n,m}表示,根据符号匹配n到m次 |
^ 和 $ | ① ^ 放在匹配字符串的开头 ② $ 放在匹配字符串的结尾 | ① ^ 用于匹配字符串的开头 ② $ 用于匹配字符串的结尾 |
\ | \要转义的字符 | 需要转义的字符有:[]().\^$|?*+{} |
\t \n \r | 单独使用 | 分别匹配换行符,换行符,换行符 |
() | (其它符号)(其它符号) | 将其它符号用()括起来进行分组, 并将放到$Matches局部变量中,其存储结构如下: ① $Matches[0]存整个匹配的结果 ② $Matches[1]及以后存每组匹配的结果 ③ 可用输入$Matches查看所有结果 |
?<> | (?<键名>其它符号) | 放在分组符号()的开头,用于对$Matches变量中取键名,相比下标更直观,但注意一旦取了键名,那么下标就不能用了 |
<# 正则表达式中的替代
# 1.字符串 -replace 正则表达式,替换用的字符串
# 2.可用$n指代分组匹配后的字符串,注意n是从1开始的,注意可用$&表示整个文本
# 3.如果在双引号中用$n,则必须用反引号进行转义,写成`$n
# 4.如果替换用的字符串中要包含字符$,则在单引号中用$$,在双引号中用`$
#>
$str = '<img src="a.png" style="width:350px" />'
$context = 'src ="b.png" style="width:400px"'
$res = $str -replace '(<img)(.*)(/>)',"`$1 $context `$3" # 用三个()分成三组,可用$1,$2,$3分别指代。因为要在字符串中调用参数$src,故用双引号,且要对$n进行转义,写成`$n。最后将结果存到$res中,分组匹配的原理: 按顺序依次匹配(<img),(.*),(/>)只有当前一组的匹配成功,才进行下一组的匹配,以此循环,当所有组都匹配完成后,再进行替换操作。注意如果(<img)已匹配成功,当再次遇到“<img”时则用(.*)去匹配了。因此当有多个<img XXXX/>镶嵌套时,每次运行该代码只能,改变最外层的<img XXXX/>。
write-host $str
write-host $res
4.2 管道
4.2.1 基本概念
1.管道符 | 其作用是:在几组用管道符连接命令中,上一组命令到的结果,成为下一组命令的输入。(类似于SQL语言中的where嵌套查询)。且可以用符号 = = 直接指代上一组命令到的结果, = = 注意也只能用也 _== 直接指代上一组命令到的结果,==注意也只能用也 ==直接指代上一组命令到的结果,==注意也只能用也_,不可用其它变量。
2.可以用()整个管道括起来,当作一个匿名变量使用,如: (gcm | ?{$_.name -match ‘^a’}).name[0]
4.2.2 Get-Member
Get-Member可简写成gm,用于查看对象有哪些属性
# 查看对象有哪些属性
ls | gm
4.2.3 Where-Object
Where-Object可简写成Where或?。在{}中放条件判断语句或正则表达式,用于过滤列表中的元素值。
# 1.查询以sy字符开头的文件名
ls | ?{$_.name -match '^sy' } #注意要加大括号
# 2.查询以exe字符结尾的文件名
ls | ?{$_.name -match 'exe$' }
# 3.查询包含in字符的文件名
ls | ?{$_.name -match 'in' }
# 4.查询文件大小大于2kb的文件
ls | ?{$_.length -gt 2kb }
4.2.4 Select-Object
ForEach-Object可简写成select,用于输出指定的列或行。
# 1.输出属性为name和length的列
ls | select name,length # 不同属性名用逗号隔开
# 2.输出前3行或后3记录
ls | select -f 3 # -f是-fist的别名
ls | select -l 3 # -l是-last的别名
# 3.输出第1和第3条记录
ls | select -index 0,2
# 4.输出除了第3条记录外的所有记录
ls | select -skip 2
# 5.输出不重复的记录
1,2,3,4,4,5,5 | select -unique
# 5.给输出的列取别名
ls | select @{Name="fileName";Expression={$_.Name}}
4.2.5 Sort-Object
Sort-Object可简写成sort,用于数据进行排序。
# 1.先根据length排序,再根据name排序
ls | sort length,name
# 2.根据name倒序排序
ls | sort -Descending name
4.2.6 ForEach-Object
ForEach-Object可简写成foreach和%,用于对每一条记录进行处理。
# 使每一项都乘5
1..10 | %{$_*5 }
4.2.7 Group-Object
Group-Object可简写成group,用于指定属性进行分组,同时输出每组的个数
# 根据length属性进行分组
ls | group length
4.2.8 保存结果
# 1.Tee-Object ====================================================================
# Tee-Object可简写成tee,用于把筛选结果输出到文件或变量中
# (1).筛选结果输出到文件中
ls | select -f 3 | tee C:\Users\asus\Desktop\a.txt
# (2).筛选结果输出到变量中
ls | select -f 10 | tee -v files # 注意:这里的变量名前面不要加$,-v是-Variable的别名
# 补.其实不用tee也能把筛选结果输出到变量中
$files = ls | select -f 10
# 2.Export-Csv和Import-Csv ========================================================
# Export-Csv和Import-Csv可简写成epcsv和ipcsv,用于把筛选结果输出到csv文件中,或导入csv文件
# (1).筛选结果输出到csv文件中
ls | select -f 10 | epcsv C:\Users\asus\Desktop\a.csv -NoTypeInformation
# 用-NoTypeInformation去掉开头的类型信息
# (2).导入csv文件,并保存到mytable变量中
ipcsv c:\Users\asus\Desktop\a.csv | tee -v mytable
4.3 其它
也可以用find或findstr等进行信息的筛选。
五.文件
5.1 查看文件
注意:如果要查询文件,建议用管道符。
命令 | 常用语法 | 描述 |
---|---|---|
cd | cd 路径名 | 用于跳转到相应的路径,建议路径名以\结尾,避免跳转失败 |
cat | cat 文件名 | ① 查看指定文件中的内容 ② 如果出现乱码的情况可用参数 -encoding UTF8 |
ls | 单独使用 | 查看当前目录的所有文件和文件夹 |
tree | ① tree ② tree /f | ① tree查看当前目录即所有子目录中的文件夹 ② /f参数查看当前目录即所有子目录中的文件夹和文件 |
fhx | fhx 文件名 | 以十六进制形式打开文件 |
5.2 创建与删除
命令 | 常用语法 | 描述 |
---|---|---|
Test-Path | Test-Path 文件名 | 用于检查指定文件或文件夹是否存在,返回bool值 |
mkdir | mkdir 文件名 | 用于创建文件夹 |
new-item | new-item 文件名 | ① tree查看当前目录即所有子目录中的文件夹 ② /f参数查看当前目录即所有子目录中的文件夹和文件 |
rm | rm 文件名 | ① 用于删除文件或文件夹,且删除后不会进入回收站 ② 如果文件夹中有内容,则删除时会提醒用户 |
5.3 拷贝与移动
命令 | 常用语法 | 描述 |
---|---|---|
cp | cp 源文件 目标文件 | ① 复制文件到指定位置,文件夹建议以/结尾 ② 用 .\ 指代当前路径 |
mv | mv 源文件 目标文件 | ① 源文件和目标文件路径相同,且不存在目标文件则对源文件重命名 ② 源文件和目标文件路径相同,且存在目标文件则移动源文件 ③ 源文件和目标文件路径不同,且不存在目标文件则先创建再移动源文件 |
5.4 其它
命令 | 常用语法 | 描述 |
---|---|---|
ren | ren 旧名称 新名称 | 对文件进行重命名,用 .\ 指代当前路径 (可改文件后缀名) |
Compress-Archive | Compress-Archive 原文件 目标文件.zip | 压缩成zip文件 |
Expand-Archive | Expand-Archive 原文件.zip 目标文件 | 解压文件zip文件 |
六.网络
命令 | 常用语法 | 描述 |
---|---|---|
netstat | netstat -ano | 显示各个应用程序的端口号和进程ID,可结合管道符筛选信息 |
ping | ping 网站地址 | 检测与网站连接的稳定性 |
ipconfig | ipconfig | 查看本机IP地址 |
route print | route print | 打印路由信息 |
七.进程与服务
命令 | 常用语法 | 描述 |
---|---|---|
ps | ps | 显示各个应用程序的进程ID等信息 |
gsv | gsv | 显示系统中正在运行的服务 |
start | ① start 应用程序名 ② start 网址 | 打开应用程序或网站(包括文件夹) |
kill | kill -pid 进程ID | 关闭进程,不包括子进程 |
taskkill | taskkill -f -t -pid 进程ID | 强制关闭进程,包括所有由它启动的子进程 |
八.用户
注意以管理员权限运行powershell
命令 | 常用语法 | 描述 |
---|---|---|
net user | ① net user ② net user 用户名 ③ net user 用户名 密码 ④ net user 用户名 /passwordchg:yes/no ⑤ net user 用户名 /active:yes/no | ① 显示所有用户的信息 ② 显示指定用户的详细信息 ③ 修改指定用户的密码 ④ 禁止或允许用户修改密码 ⑤ 禁用或启用指定用户 |
net user /add | net user /add 用户名 密码 | 创建指定用户 |
net user /del | net user /del 用户名 | 删除指定用户 |
net localgroup | net localgroup administrators 用户名 /add | 将指定用户提升为管理员 |
九.基础数据类型及操作
[int]$num1 = 10 # 显式定义类型
$num2 = 20 # 隐式定义类型
$num1,$num2 = $num2,$num1 # 交换两个数
[double]$num3 = $num4 = 12.3 # 连续赋值
$num2 = [int]$num3 + [int]$num4 # 强制类型转换
$num1.getType() # 查看变量的数据类型
$num1 -is [int] # 判断变量的类型,返回bool
十.字符串
10.1 定义字符串
[string]$str1 = "hello word" # 显式定义类型
$str2 = "hello word" # 隐式定义类型
$str3 = 'hello word' # 用单引号定义字符串
$str4 = "time is $(get-data)" # 在双引号字符串中用$()来插入变量或命令,并在使用时调用指定对象
$str5 = "I want `"kill`" Tom" # 在双引号字符串中用`转意""字符
"name:{0} age:{1} sex:{2}" -f $m_name,$m_age,$m_sex # 格式化字符串
10.2 字符串相关函数
10.2.1 判断字符串中的字符
# 语法:
# (1) 源字符串.EndsWith(目标字符串) # 判断是否以指定字符结尾(即判断后缀名),返回bool
# (2) 源字符串.Contains(目标字符串) # 判断是否包含某个字符串,返回bool
# (3) 正则表达式匹配 (最推荐)
# 例子:
$str = "banlin.txt"
$str.EndsWith("exe") # 结果:true
$str.Contains("an") # 结果:true
$str -match 'lin' # 结果:true
10.2.2 字符串的比较
注意:也可以用条件运算符来比较两个字符串。
# 语法: 源字符串.compareto(目标字符串)
# 描述: 相同返回0,大于返回1,小于返回-1
# 例子:
$str = "banlin.txt"
$str.compareto("w") # 结果:结果:-1
10.2.3 字符串的分组
# 语法: 源字符串.Split(目标字符串)
# 描述: 根据目标字符串对源字符串进行分组,返回字符串数组
# 例子:
$str = "banlin.txt"
$strArr = $str.Split(".")
$strArr[-1] # 结果:txt
10.2.4 字符串的替换
# 语法: 源字符串 -replace 正则表达式,目标字符串
# 描述: -replace会对源字符串进行正则表达式匹配,如果匹配成功,则将匹配成功部分替换成目标字符串
# 例子: 取出img标记中的文件路径
$str = '<img src="a.bmp" />' -replace "[<img src=`"`"/>]","" # 结果: $str = a.bmp
十一.数组
注意:大多数查询语句的返回值都是数组类型
11.1 数组的定义与取值
$arr1=@(1,2,3) # 用@()定义数组
$arr2=1,2,3 # 定义非空数组时,@()可不写
$arr3=@() # 定义一个空数组
$arr4 = 1..100 # arr4∈[1,100],注意中间是两个点
$strArr = "asd","qwer","dsd" # 字符串数组
$anyArr = "esb",34,1.32,(1,3,4),(ls),"sad" # 定义广义表 (串中可以放命令)
$anyArr[3][1] # 变量名[下标],访为数组中的元素,如果该元素也是数组类型,则可连续用[]访问
$anyArr[-1] # 取出数组中最后一个元素
$anyArr = $anyArr[($anyArr.length)..0] # 取倒序数组
11.2 添加或删除元素
由于数组添加或删除元素受到限制操作不变,因此一般先将其转换成链表再操作。
$arr = 1,2,3,4,5,6
[System.Collections.ArrayList]$list = $arr
$list.count # 获得链表的长度
$list.IndexOf(1) # 查询链表中指定元素的下标,如果有多个相同元素,返回第一个元素的下标
$list.RemoveAt(4) # 删除下标为4的元素
$list += 99 # 在链表的末尾添加元素
$list.Insert(0,33) # 在下标为4的位置插入数值33
十二.哈希表
$hash = @{name='xiaoming'; age=123} # 注意键值对之间用分号隔开
$hash.keys # 查看所有key
$hash.values # 查看所有value列表
$hash.ContainsKey("name") # 判断是否存在指定的key,注意key参数必须要加引号
$hash.add("sex","boy") # 添加键值对,注意key参数必须要加引号,且key值是不重复的
$hash.Remove("age") # 删除指定的键值对
$hash.neme # 访问哈希表中的元素
十三.输入输出
$name = read-host "请输入姓名" # read-host 提示用的字符串
write-host "你的姓名是: $name"
十四.选择结构
14.1 if条件判断
$num = 95 # 定义变量
if($num -ge 90 -and $num -le 100){
write-host "so good"
}
elseif($num -ge 80 -and $num -lt 90){
write-host "gool"
}
elseif($num -ge 70 -and $num -lt 80){
write-host "normal"
}
else{
write-host "number is error"
}
14.2 switch条件判断
$num = 95 # 定义变量
switch($num)
{
95 {"grade is 95"} # 相等条件直接写数值 (注意: 不要加大括号)
{$num -ge 90}{ "so good" } # 复杂条件判断语句,要加大括号
{$_ -ge 80}{ "good" } # 用$_指代$num
{($_ -ge 70) -and ($_ -lt 300) }{ "error" } # 复合条件判断,每个条件建议用括号括起来
}
十五.循环结构
15.1 foreach循环
# 输出桌面文件中大于1kb的文件的名称
foreach($file in (ls C:\Users\asus\Desktop)){ # 括号()可以去掉
if($file.length -gt 1kb){
write-host $file.name # length和name都是ls结果的列名
}
}
15.2 while循环
# while循环
$num = 150
while ($num -ge 0){
if($num -lt 20){
break;
}
write-host $num
$num--
}
# do while循环
$num = -1
do{
$num--
if($num%3 -eq 0){
continue
}
write-host $num
}while ($num -gt -100)
15.3 for循环
for($i=200;$i -le 300;$i++){
write-host $i
}
十六.函数
16.1 函数别名
命令 | 常用语法 | 描述 |
---|---|---|
Get-Alias | ① Get-Alias ② Get-Alias 别名 | ① 查看所有别名所对应的函数名 ② 查看指定别名所对应的函数名 |
Set-Alias | Set-Alias 别名 函数名 | ① 给函数创建别名 (在PowerShell后自动删除) ② 可以用 del alias:别名 直接删除别名 |
Export-Alias | Export-Alias 文件名.ps1 | 导出别名,即保存别名 |
Import-Alias | Import-Alias -f 文件名.ps1 | 强制导入出别名(在PowerShell后自动还原) |
16.2 定义函数
# 无参函数
function myfunc{
Write-Host "这是一个无参函数" # 输出函数,类似于echo
}
# 有参函数
function myadd($num1,$num2){
$num3 = $num1 + $num2
return $num3
}
# 有参函数,并设置默认参数
function myArr($num1,$num2=10){ # 可以设置默认参数
$num3 = $num1 + $num2
return $num1,$num2,$num3 # 返回一个数组
}
myfunc # 注意:调用无参函数时函数名后面不能加()
# $res = myadd -123 -434 # 不同的调用方法
$res = myadd 123 434 # 不同的调用方法
write-host $res
$arr = myArr 123
write-host $arr
十七.脚本
17.1 必要知识
1.如果无法运行脚本则,先以管理员身份运行PowerShell,用Get-ExecutionPolicy 查看权限是否是restricted 即受限制的,再用Set-ExecutionPolicy Unrestricted 更改权限即可。
2.脚本文件通常以.ps1作为后缀名,运行脚本用 .\xxx.ps1 命令注意开头要加 .\ 表示当前路径下的脚本文件。
17.2 文件相关
# 1.输出错误日志
function Print-Log($mode,$info)
{
if("$mode" -eq "ERROR"){
Write-Host -ForegroundColor:Red "[ERROR]:".PadLeft(10) -NoNewline
Write-Host -ForegroundColor:Green "$info"
}
elseif("$mode" -eq "WARNING"){
Write-Host -ForegroundColor:Yellow "[WARNING]:".PadLeft(12) -NoNewline
Write-Host -ForegroundColor:Green "$info"
}
else{
Write-Host -ForegroundColor:Red "[ERROR]:".PadLeft(10) -NoNewline
Write-Host -ForegroundColor:Green "请传入正确的`$mode参数"
return;
}
}
$path = "C:\Users\asus\Desktop\test"
$SuffixName = "txt"
$num = 20
# 2.批量生成文件
function create-files($filePath=$path,$Suffix=$SuffixName,$number=$num)
{
if(-not (Test-Path $filePath)){ # 检查指定文件或文件夹是否存在,注意要加括号
mkdir $filePath # 创建指定文件夹
}
elseif((ls $filePath | measure).count -ne 0){ # 根据文件数量,判断该文件夹是否为空
Print-Log ERROR "该文夹不为空"
return;
}
for($i = 1; $i -le $number; $i++){
New-Item "$filePath\$i.$Suffix"
}
}
# 3.批量修改文件名
function rename-files($filePath=$path,$Suffix=$SuffixName,$number=$num)
{
if(-not (Test-Path $filePath)){ # 检查指定文件夹是否存在,注意要加括号
Print-Log ERROR "该文夹不存在"
return;
}
elseif((ls $filePath | measure).count -eq 0){ # 根据文件数量,判断该文件夹是否为空
Print-Log ERROR "该文夹为空"
return;
}
for($i = 1; $i -le $number; $i++){
ren "$filePath\$i.$Suffix" "$filePath\$i`_$i.$Suffix" # 要对_进行转义
}
}
# 4.用正则表达式替换指定文件中的文本(当有多层嵌套时,以下方法每次运行只能,改变最外层的<p><p/>)
function Replace-world($path)
{
if(-not (Test-Path $path)){ # 检查指定文件或文件夹是否存在,注意要加括号
Print-Log ERROR "该件或文件夹不存在"
return;
}
elseif([String]::IsNullOrWhiteSpace((cat "$path"))){ # 检查文件是否为空或仅包含空格
Print-Log ERROR "该文夹为空"
return;
}
$context = cat "$path"
$str1 = "<h>"
$str2 = "</h>"
$context -replace '(<p>)(.*)(</p>)',"$str1 `$2 $str2" | tee ccc.txt
}
# 5.计算当前文件夹中各个文件或文件夹的大小(当文件中存在无法访问的文件时,计算结果会出错)
function Count-FileSize($path=".\")
{
$size = (ls $path | %{ ls -r $_.Name | measure length -sum}).Sum
$name = ls $path | select name
$name = $name.name # $name是复合类型是有标题的,因此用$name.name取字符串数组
$len = $name.count
for($i=0;$i -lt $len-1;$i++){
for($j=0;$j -lt $len;$j++){
if($size[$j] -lt $size[$j+1]){
$size[$j],$size[$j+1] = $size[$j+1],$size[$j]
$name[$j],$name[$j+1] = $name[$j+1],$name[$j]
}
}
}
$strNull = " " # 20个空格
Write-Host " Name Size(KB) "
Write-Host "---------- ----------"
for($i=0;$i -lt $len-1;$i++){
Write-Host $name[$i] -NoNewline
# Write-Host " ". -NoNewline
"{0:n1}".PadLeft(35-$name[$i].length) -f ($size[$i]/1024) # 注意要用括号括起来
}
}
十八.导入模块
1.在系统环境变量PSModulePath中保存着模块的位置,PowerShell会根据该路径递归搜索每个文件夹中的模块。
2.以管理员权限运行PowerShell 用cd ProgramFiles\PowerShell\Modules
到该路径中,新建一个文件夹名为testmod,进入该文件并新建一个文件名为 testmod.psm1,最后在该文件中写入所运行的脚本。(注意在该文件夹中至少要有一个模块名与该文件夹名相同)用Get-Command -Module testmod
验证是否创建成功。
3.若需要在每次打开PowerShell时都默认导入这个模块,可以在PowerShell的profile.ps1
文件中添加Import-Module testmod,
命令。注意有时profile.ps1
是默认不存在的,所以我们自己直接用 Add-Content $PROFILE.AllUsersAllHosts 'Import-Module testmod'
命令,如果profile.ps1
不存在则先创建再添加,如果存在则直接追加指定内容。并可用 $PROFILE.AllUsersAllHosts
查看profile.ps1
文件的位置。
十九.结语
PowerShell其本身内容非常的多且细,如果要深入学习建议看官方的文档 PowerShell官方文档
作者:墨尘_MO
时间:2023年3月12日