什么是powershell
Windows Powershell 是一种命令行外壳程序和脚本环境,可以将命令列表做成脚本来完成,简化人工操作,功能强大杀毒软件扫描不到。
打开powershell
可以通过win+r 输入powershell来打开,在powershell ise 中用户可以运行命令,编写脚本,测试和调试脚本,powershell ise拥有自己的配置文件,可以使用函数,别名,变量和命令。如果忘记命令的编写参数,可以通过ise的右侧命令检索器中检索出需要的命令。
powershell的输入与输出
read-host “输入文字”
write-output(“输出文字”)/write-output “输出”
write-error() 错误信息输出
echo “显示信息”
powershell 变量、常量、数组
1、变量
powershell 是一种弱类型语言,所谓弱类型语言,是指不用区分数据类型,不像java语言一样,在定义变量时必须指定变量的类型,shell可以根据数据的值自动的赋予类型,不过在使用时一般都需要指定变量类型,用于强定义。
shell中变量的赋值: $变量名 = 值 $name = xiaoming
shell 变量可以分为用户变量,环境变量,常量,需要自定义的是用户变量。
2、环境变量
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件和系统文件夹位置等。
在安装一些软件时需要进行环境变量的配置,安装Tomcat后需要检查配置环境变量,powershell中可以利用 $evn:环境变量名来检查这些变量,或调试其他变量。
当需要的环境变量不存在时可以通过powershell临时生成环境变量,仅在powershell中有效,重新打开就没有了,
格式为 $env:环境变量名 = 值的格式用于生成新的环境变量。
如果要写入环境变量,可以使用:
[system.environment]::setenvironment variable(“testpath”,“d/test”,“machine”)的方法写入到系统环境变量中
[environment]::setenvironment variable(“path”,";c:\powershellscript",“user”) 的方法写入到用户环境变量中
3、常量
相对于变量而言,常量是不可改变的量,在powershell 中常量的使用需要声明。 —name 用于申明常量名,—value 用于声明常量值,声明常量不需要"
"
,
但
使
用
时
需
要
加
上
“
",但使用时需要加上“
",但使用时需要加上“”符号。
4、数组
数组就是有序的元素序列,具有相同类型的若干元素按有序的形式组织在一起的一种形式,数组的长度不能扩大,数组的大小由它包括的元素决定。
数组的声明有4种形式:
1、
a
r
r
a
y
n
a
m
e
=
1
,
2
,
3
,
42
、
array_name = 1,2,3,4 2、
arrayname=1,2,3,42、array_name = 1…10 表示1到10
3、
a
r
r
a
y
n
a
m
e
=
@
(
)
定
义
空
数
组
4
、
array_name = @()定义空数组 4、
arrayname=@()定义空数组4、array_name [0] 数组从下标0开始
5、强类型
在强类型中限制了变量和数组的数据类型,只允许给当前变量赋指定的值,如果给 int 赋予小数型则会被四舍五入,赋予字符串则编译不通过。
6、字符串
shell中字符串可以接受其他任意类型的值并转为字符串类型,但不能反过来,[string] $name = 1233。字符串型,非数值型不能转换成数字类型。任意数据类型 + 字符串类型,结果为前面的数据类型。
常用字符串操作函数
操作符 | 描述 |
---|---|
-replace | 替换字符 |
-like | 验证字符串是否包含关系 |
[string]::isnullorempty(str) | 验证字符串是否包含关系 |
.contains() | 验证包含关系 |
.split() | 字符串拆分,以空格拆分 |
.split(“str”) | 字符串拆分,以字符串拆分 |
.length | 获取字符串长度 |
.insert (int,str) | 在指定位置插入字符串 |
.remove(start,length) | 删除从指定位置到指定线长度的字符串 |
.substring(start,end) | 截取字符串长度 |
逻辑控制语句
if-else 当逻辑只有两种时使用
if-elseif-else 多个分支
if-if(会执行所有的 if 分支)
逻辑运算符
运算符 | 说明 |
---|---|
-not | 非 运算,表达式为true则返回false,反之返回true |
-or | 或 运算,有一个表达式为true则返回true |
-and | 与 运算,两个表达式均为true才返回true |
-xor | 逆或 运算 |
关系运算符
运算符 | 说明 |
---|---|
-eq | 检测两个数是否 相等 ,相等返回true。 $a -eq $b |
-ne | 检测两个数是否 不相等。 |
-gt | 检测左边的数是否 大于 右边的数 |
-ge | 检测左边的数是否 大于等于 右边的数 |
-lt | 检测左边的数是否 小于 右边的数 |
-le | 检测左边的数是否 小于等于 右边的数 |
[String]::IsNullOrEmpty(str) | 判断字符串是否为空 |
-match | 判断字符串是否匹配给定的正则表达式 |
正则表达式
正则表达式通常被用来检索、替换那些符合某个模式的文本是对字符串操作的一种逻辑公式。
运算符 | 说明 |
---|---|
^ | 在字符串的开始匹配 |
. | 匹配出了换行符之外的任意字符 |
[^abc] | 匹配除了包含在中括号的任意字符 |
[abc] | 匹配括号中指定的任意一个字符 |
[a-z] | 匹配括号中指定的任意区间之中的任意一个字符 |
[^a-z] | 匹配除了包含在括号指定区间字符的字符 |
\B | 不在单词的边界匹配 |
\Z | 在字符串的结尾匹配(包含多行文本) |
\uFFFF | 匹配 Unicode 字符的十六进制代码 FFFF。eg:欧元符号的代码20AC |
\v | 匹配纵向制表符(ASCII 11) |
\w | 匹配字符、数字和下划线 |
\W | 匹配字符、数字和下划线以外的字符 |
\a | 响铃字符(ASCII 7) |
\c or \C | 匹配 ASCII 中的控制字符, eg:Ctrl+C |
\d | 匹配数字字符,等同于[0-9] |
\D | 匹配数字以外的字符,等同于[^0-9] |
\e | Esc (ASCII 9) |
\f | 换页符(ASCII 15) |
\n | 换行符 |
\r | 回车符 |
\s | 白空格(空格、制表符、新行) |
\S | 匹配(空格、制表符、新行)以外的字符 |
\t | 制表符 |
\A \ | 在字符串的开始匹配(包含多行文本) |
\b | 在字符串的边界匹配 |
\xnn | 匹配特色字符,nn 代表十六进制的ASCII 码 |
.* | 匹配任意数量的字符(包括0个字符) |
* | 匹配一个元素 0 次或多次(最大限度地匹配) |
*? | 匹配前面的元素 0 次或多次(最小限度地匹配) |
? | 匹配上一个元素 0 次或 1 次(最大限度地匹配) |
?? | 匹配上一个元素 0 次或 1 次(最小限度地匹配) |
{n,} | 匹配上一个元素至少 n 次 |
{n,m} | 匹配上一个元素 n~m 次 |
{n} | 匹配上一个元素 n 次 |
+ | 匹配上一个元素 1 次或多次 |
$ | 在字符串的结尾匹配 |
循环语句
while
while(判断条件){
循环语句
}
for
for(定义变量;变量判断;变量自增自减){
循环语句
}
foreach
foreach(变量 in 组){
变量操作
}
跳出循环
Continue — 退出本次循环
Break — 退出整个循环
函数的定义与调用
代码块以function开头,后接函数标识符和圆括号。
参数放在括号中间,各参数以逗号隔开。
内容以{ 首行缩进 }
return[表达式]结束函数,选择性的返回一个值给调用方。
不带return表达式的函数默认返回 none 。
function 函数名(参数){
函数体
}
参数
形参
形式上的参数,在定义函数时,声明函数需要接收的参数个数,类型,顺序。
实参
实参是调用函数时给函数传入的实际参数值,参数的传入过程中必须按照形参定义的顺序,个数,类型传入。
管道
PowerShell中的管道如何工作?
PowerShell的管道,能够传递对象,这是一个巨大的进步。到这个时候,管道才有了点函数调用的味道。调用方能够传递复杂的对象,接收方则要进行对象的类型匹配,匹配不正确命令执行就会出错。但这里也有例外。PowerShell管道不但可以按整个对象传递,还能够按照属性名传递,这一特性大大提高了管道的可用性,和处理能力。这使得我们能够在类型不匹配的情况下,也能够使用管道,传递对象的部分属性。
管道使用举例
在PowerShell中有一些专门为管道设计的命令如get-member、sort、measure等,也有一些命令虽然不是为管道专门设计,但却在管道中大放光彩。下面举例说明几个最常用的命令:
select
在管道中使用select命令,就像在Cmd中使用dir一样常见。不用看select命令的详细语法,你就能写出最常用的select使用方法。如下:
dir | select name,LastWriteTime
这个命令显示当前文件夹中的文件和子文件夹的名字和最后修改日期。
where
where命令使用来做筛选的,可以简写为?,使用示例如下:
dir | ? {$_.mode –like “d*”} | select name,LastWriteTime
这个命令能够只显示出当前文件夹的子文件夹,而不显示文件。
foreach
foreach可以对传递过来的每个对象进行处理,可以简写为‘%’。使用示例如下:
dir | ? {KaTeX parse error: Expected 'EOF', got '}' at position 21: …e -notlike "d*"}̲ | % {echo "The…($.name)’ is $.Length"}
这个命令的结果是输出类似“The size of file ‘myScript.ps1’ is 1520”这样的信息,每个文件一行。
管道 | 描述 |
---|---|
where-object | 过滤列表项或输出命令结果 |
foreach-object | 处理列表或者命令输出的每一个项目 |
select-object | 选择列表项或输出想要结果 |
sort | object |
tee-object | 保存并输出列表项或者输出结果 |
group-object | 对列表项或者输出结果进行分组 |
convertto-HTML | 将对象转变为HTML文件 |
powershell 练习题
1、从键盘输入一个字符,判断这个字符是大写字母,小写字母,还是数字符号。
while(1 -eq 1){
[char]$a = Read-Host "请输入一个字符"
[int]$chr = [char]$a
if($chr -ge 48 -and $chr -le 57){
Write-Output "这是一个shuzi "
}elseif(($chr -ge 65) -and ($chr -le 90)){
Write-Output "这是一个大写字母"
}elseif(($chr -ge 97) -and ($chr -le 122)){
Write-Output "这是一个小写字母"
}else{Write-Output "这是一个符号"}
if($chr -eq 101){
break
}
}
2、统计字符:从键盘输入一个字符串,统计这个字符串当中包含几个大写字母,几个小写字母,几个数字,几个特殊符号。
Write-Output("请输入一个字符串:")
$a=Read-Host
[char[]]$char_array = $a.ToCharArray()
[int]$length = $char_array.Length
$sumUp=0
$sumLow=0
$sumNum=0
$sumSpe=0
for($i=0;$i -lt $length;$i++){
$int_array= [int]($char_array[$i])
if(($int_array -ge 65)-and ($int_array -le 90)){
$sumUp++
}
elseif(($int_array -ge 97)-and ($int_array -le 122)){
$sumLow++
}
elseif(($int_array -ge 48)-and ($int_array -le 57)){
$sumNum++
}else{
$sumSpe++
}
}
Write-Output("这个字符串中包含{0}个大写字母,{1}个小写字母,{2}个数字及{3}个特殊符号" -f $sumUp,$sumLow,$sumNum,$sumSpe)
3、水仙花数:计算三位整数(100~999)的水仙花数。水仙花数是指每一位的立方相加等于该数自己,比如153 = 1^3 + 5^3 +3^3
for($i = 100;$i -le 999;$i++){
[string]$a = $i
[int]$bai = $a.Substring(0,1)
[int]$shi = $a.Substring(1,1)
[int]$ge = $a.Substring(2,1)
if(($bai*$bai*$bai)+($shi*$shi*$shi)+($ge*$ge*$ge) -eq $a){
Write-Output "水仙花数" $a
}
}
4、字符串判断:从键盘输入一个字符串,判断该字符串是否可以被转换为一个有效的数字。
Write-Output("请输入一个字符串:")
$s = Read-Host
$else = "[^0-9]"
if($s.Length -eq 1){
Write-Output("能被转换为一个有效的数字")
}elseif($s.Length -ge 2){
if($s -match $else){
Write-Output("不能被转换为一个有效的数字")
}else{
Write-Output("能被转换为一个有效的数字")
}
}
5、打印99 乘法表。
for($i=1;$i -lt 10;$i++){
for($j=1;$j -le $i;$j++){
$sum = $i * $j
Write-Host("{0} * {1} = {2} " -f $i,$j,$sum) -nonewline
}
Write-Output("")
}
6、一个10000 以内整数,它加上100 和加上268 后都是一个完全平方数,请问该数是多少?
for($i=1;$i -lt 10000;$i++ ){
for($j=1;$j -lt 100;$j++ ){
if(($j*$j) -eq ($i + 100) ){
for($k=1;$k -lt 100;$k++ ){
if(($k*$k) -eq ($i + 268)){
Write-Output($i)
}
}
}
}
}
7、拆分字符串
[string]$s = "网络空间安全"
Write-Output($s.substring(0,2))
Write-Output($s.substring(1,2))
Write-Output($s.substring(2,2))
Write-Output($s.substring(3,2))
Write-Output($s.substring(4,2))
8、冒泡排序
$test_array=12,34,56,78,90
for($i = 0; $i -lt 4; $i++){
for($j = 0; $j -lt 4 - $i; $j++){
if($test_array[$j] -gt $test_array[$j+1]){
$temp = $test_array[$j]
$test_array[$j] = $test_array[$j+1]
$test_array[$j+1] = $temp
}
}
}
foreach($index in $test_array){
Write-Output($index)
}
9、计算200 以内的所有质数(即只有1 和其自身能够被这个数整除的数),建议使用至少3 种算法实现,看看哪一种算法的运算次数最少。
for($i=2;$i -le 200;$i++){
for($j=2;$j -lt $i;$j++){
$flag=1
if(($i%$j) -eq 0){
$flag=0
break
}
}
if($flag -eq 1){
Write-Output($j)
}
}
10、设定的总行数line 可以随机修改,修改后仍然能打印出line 行的直角三角形。
打印如下两种三角形图形:
$num = Read-Host "请输入行数"
for($i = 0; $i -le $num; $i++){
for($j = 0; $j -le $i; $j++){
Write-Host "* " -NoNewline
}
Write-Host
}