Powershell入门语法
程序员文章站
2023-12-30 17:09:04
...
Powershell简介
- 由于cmd功能比较小,所以windows上诞生了新的shell类型。
- powershell有很多版本。不同版本的操作系统内置的powershell版本也不一样。可以升级。
- $PSVersionTable:查看powershell版本。
PS C:\Users\JYT> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.19041.610
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.19041.610
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
- powershell强大之处:
- 对计量单位的计算。
- 1gb可以直接计算出字节。
- 可以直接
+-*/%
进行数学计算。- 102410241024
- 命令是通过动词+名词的形式,组合成一个命令。
- Get-Service,获取当前的服务名。
- Get-Date,获取当前的时间和日期。
- 支持面向对象。
- 可以和.net平台绑定。
- 和cmd、vbs绑定非常高。
- 对计量单位的计算。
Powershell管道和重定向
- 管道
- 重定向
PS C:\Users\JYT\Desktop> ls | Format-Table name,mode
Name Mode
---- ----
1.txt -a----
bkce-nfs.sh -a----
Google Chrome.lnk -a----
new 2 -a----
test.bat -a----
test.txt -a----
test_bak.bat -a----
WPS Office.lnk -a----
教育厅远程.lnk -a----
PS C:\Users\JYT\Desktop> ls > .\1.txt
PS C:\Users\JYT\Desktop> type .\1.txt
目录: C:\Users\JYT\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2020/12/2 9:51 0 1.txt
-a---- 2020/9/11 8:47 1029 bkce-nfs.sh
-a---- 2020/12/1 1:28 2423 Google Chrome.lnk
-a---- 2020/6/1 11:54 2820 new 2
-a---- 2020/12/1 15:17 309 test.bat
-a---- 2020/12/1 11:00 2048 test.txt
-a---- 2020/12/1 16:00 702 test_bak.bat
-a---- 2020/5/21 3:11 1492 WPS Office.lnk
-a---- 2020/5/18 11:19 738 教育厅远程.lnk
Powershell数学运算
- +、-、*、/、%
- ()
- 单位转换:1gb*1kb
- 逻辑判断:-gt、-eq…
- 进制转换
Powershell执行外部命令
- 直接输入命令,比如:notepad.exe
- 通过&“可执行命令”,比如:&“notepad”
- 注意:命令必须在PATH变量中。
- 查看path变量的值:$env:path
- 修改path环境变量: e n v : p a t h = env:path= env:path=env:path+""
PS C:\Users\li> $env:path
C:\ProgramData\Oracle\Java\javapath;C:\Program Files\Python37\Scripts\;C:\Program Files\Python37\;C:\Program Files\VanDyke Software\Clients\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Microsoft VS Code\bin;C:\Program Files\Git\cmd;C:\Users\li\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Microsoft VS Code\bin;C:\Program Files\ffmpeg\bin;
Powershell命令集
- Get-Command:获取当前系统上的所有命令。
PS C:\Users\li> Get-Command
CommandType Name Version Source
----------- ---- ------- ------
Alias Add-AppPackage 2.0.1.0 Appx
Alias Add-AppPackageVolume 2.0.1.0 Appx
Alias Add-AppProvisionedPackage 3.0 Dism
Alias Add-ProvisionedAppPackage 3.0 Dism
Alias Add-ProvisionedAppxPackage 3.0 Dism
Alias Add-ProvisioningPackage 3.0 Provisioning
Alias Add-TrustedProvisioningCertificate 3.0 Provisioning
Alias Apply-WindowsUnattend 3.0 Dism
Alias Disable-PhysicalDiskIndication 2.0.0.0 Storage
Alias Disable-StorageDiagnosticLog 2.0.0.0 Storage
Alias Dismount-AppPackageVolume 2.0.1.0 Appx
Alias Enable-PhysicalDiskIndication 2.0.0.0 Storage
Alias Enable-StorageDiagnosticLog 2.0.0.0 Storage
Alias Flush-Volume 2.0.0.0 Storage
Alias Get-AppPackage 2.0.1.0 Appx
Alias Get-AppPackageDefaultVolume 2.0.1.0 Appx
Alias Get-AppPackageLastError 2.0.1.0 Appx
Alias Get-AppPackageLog 2.0.1.0 Appx
Alias Get-AppPackageManifest 2.0.1.0 Appx
Alias Get-AppPackageVolume 2.0.1.0 Appx
# alias:别名命令
# cmdlet:powershell内置的命令
# Function:函数命令。
#
- get-help get-command:查看get-command命令的帮助。
PS C:\Users\li> get-help get-command
名称
Get-Command
语法
Get-Command [[-ArgumentList] <Object[]>] [<CommonParameters>]
Get-Command [[-Name] <string[]>] [[-ArgumentList] <Object[]>] [<CommonParameters>]
别名
gcm
备注
Get-Help 在此计算机上找不到该 cmdlet 的帮助文件。它仅显示部分帮助。
-- 若要下载并安装包含此 cmdlet 的模块的帮助文件,请使用 Update-Help。
-- 若要联机查看此 cmdlet 的帮助主题,请键入: "Get-Help Get-Command -Online" 或
转到 https://go.microsoft.com/fwlink/?LinkID=113309。
- Get-Alias:查看当前会话的别名。
- Get-History:查看当前会话的历史记录。
- Get-Date:查看当前日期。
Powershell别名的使用
- Get-Help Get-ChildItem:查看命令的别名是什么。
- Get-Alias -name ls:查看ls别名的完整命令。
- Get-Alias | where {$_.Definition.StartsWith(“Remove”)}:查询别名中的原始命令以Remove字符开头的信息。
- $_表示当前的信息。
- Definition:是.net中的一个类库。
- Get-Alias | Group-Object Definition | Sort -descending Count:跟原始命令对别名分组,查看他别名的数量,并按照数量进行降序排列。
PS C:\Users\li> Get-Alias -name ls
CommandType Name Version Source
----------- ---- ------- ------
Alias ls -> Get-ChildItem
PS C:\Users\li> Get-Alias | where {$_.Definition.StartsWith("Remove")}
CommandType Name Version Source
----------- ---- ------- ------
Alias del -> Remove-Item
Alias erase -> Remove-Item
Alias rbp -> Remove-PSBreakpoint
Alias rd -> Remove-Item
Alias rdr -> Remove-PSDrive
Alias ri -> Remove-Item
Alias rjb -> Remove-Job
Alias rm -> Remove-Item
Alias rmdir -> Remove-Item
Alias rmo -> Remove-Module
Alias rp -> Remove-ItemProperty
Alias rsn -> Remove-PSSession
Alias rsnp -> Remove-PSSnapin
Alias rv -> Remove-Variable
Alias rwmi -> Remove-WmiObject
PS C:\Users\li> Get-Alias | Group-Object Definition | Sort -descending Count
Count Name Group
----- ---- -----
6 Remove-Item {del, erase, rd, ri...}
3 Get-ChildItem {dir, gci, ls}
3 Get-History {ghy, h, history}
3 Copy-Item {copy, cp, cpi}
3 Invoke-WebRequest {curl, iwr, wget}
3 Set-Location {cd, chdir, sl}
3 Get-Content {cat, gc, type}
3 Move-Item {mi, move, mv}
2 Invoke-History {ihy, r}
2 Get-Process {gps, ps}
2 Rename-Item {ren, rni}
2 New-PSDrive {mount, ndr}
2 Write-Output {echo, write}
2 Stop-Process {kill, spps}
2 Get-Location {gl, pwd}
2 Set-Variable {set, sv}
2 Start-Process {saps, start}
- set-alias:创建别名
- Set-Alias -name ll -value ls:临时设置别名。
- del alias:ll:删除ll别名
- Export-Alias 1_alias.txt:导出别名
- Import-Alias -force .\1_alias.txt:强制导入别名。
PS C:\Users\li> Set-Alias -name ll -value ls
PS C:\Users\li> ll
目录: C:\Users\li
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2019-9-24 10:21 .3T
d----- 2020-3-18 18:04 .android
d----- 2020-10-19 15:47 .anes
d----- 2020-6-9 18:24 .cache
d----- 2020-2-4 8:05 .local
d----- 2020-4-25 14:15 .matplotlib
d----- 2020-11-17 16:15 .oracle_jre_usage
Powershell定义变量
- 普通变量
- $name=“xiaoming”:声明一个变量name,值为xiaoming。
- $name:引用name变量。
- ${“I am a” var ()}=“haha”:如果变量名比较特别,需要使用{}。
- $name=ls:将ls命令,传给变量 n a m e 。 可 以 通 过 name。可以通过 name。可以通过name直接引用ls。
- $name=(1+7-4)/2:算数计算的结果赋值给变量$name。
- 注意:变量的值区分类型,有字符型,也有数值型。
- 注意:powershell中,变量名不区分大小写。
- $n1,$n2=$n2,$n1:变量交换值。
- ls variable::查看当前系统中的所有变量。等价于Get-Variable。
- ls variable:n1:查看当前系统中某一个变量的变量值。
- ls variable:name*:查看以name开头的普通变量。
- Test-Path variable:n1:判断某一个变量是否存在。
- 设置自动化变量:一打开终端,便会自动加载的变量。
- 只读变量:有一些自动化变量是只读变量,无法修改。比如$pid.
- $?:判断上一个命令的执行结果。
- 环境变量:
- ls env::查看当前系统上所有的环境变量。
- $env:OS:查看某一个环境变量的值。
- $env:name=“hahaha”:临时声明一个环境变量为hahaha
- ls env:nam*:查看以nam开头的环境变量。
- del env:name:删除环境变量name。
- [environment]::setenvironmentvariable(“NOW_DIR”,“C:\Users\li”,“User”):永久设置一个用户级别的环境变量NOW_DIR。
- [environment]::getenvironmentvariable(“NOW_DIR”,“User”):查看用户级别的环境变量NOW_DIR。
- 注意:环境变量分为用户环境变量和系统环境变量。
PS C:\Users\li> $name="str 123"
PS C:\Users\li> $name
str 123
PS C:\Users\li> ${name name}="haha"
PS C:\Users\li> ${name name}
haha
PS C:\Users\li> $name=ls
PS C:\Users\li> $name
目录: C:\Users\li
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2019-9-24 10:21 .3T
d----- 2020-3-18 18:04 .android
d----- 2020-10-19 15:47 .anes
d----- 2020-6-9 18:24 .cache
d----- 2020-2-4 8:05 .local
d----- 2020-4-25 14:15 .matplotlib
d----- 2020-11-17 16:15 .oracle_jre_usage
d----- 2019-7-21 11:40 .pylint.d
d----- 2019-11-19 9:00 .ssh
PS C:\Users\li> $n1=$n2=40
PS C:\Users\li> $n1
40
PS C:\Users\li> $n2
40
PS C:\Users\li> $n2=30
PS C:\Users\li> $n2
30
PS C:\Users\li> $n1
PS C:\Users\li> $n1=1
PS C:\Users\li> $n2=2
PS C:\Users\li> $n1,$n2=$n2,$n1
PS C:\Users\li> $n1
2
PS C:\Users\li> $n2
1
PS C:\Users\li> ls variable:$
Name Value
---- -----
$ variable:
PS C:\Users\li> ls variable:n1
Name Value
---- -----
n1 2
PS C:\Users\li> ls env:
Name Value
---- -----
ALLUSERSPROFILE C:\ProgramData
APPDATA C:\Users\li\AppData\Roaming
CommonProgramFiles C:\Program Files\Common Files
CommonProgramFiles(x86) C:\Program Files (x86)\Common Files
CommonProgramW6432 C:\Program Files\Common Files
COMPUTERNAME DESKTOP-SA18EPG
PS C:\Users\li> ls env:nam*
PS C:\Users\li> $env:name="hahaha"
PS C:\Users\li> ls env:nam*
Name Value
---- -----
name hahaha
PS C:\Users\li> [environment]::setenvironmentvariable("NOW_DIR","C:\Users\li","User")
PS C:\Users\li> [environment]::getenvironmentvariable("NOW_DIR","User")
C:\Users\li
Powershell脚本执行策略
- powershell脚本默认是禁止直接执行的。
- Get-ExecutionPolicy:查看powershell的脚本执行策略。
- Restricted:受限的
- Get-Help Set-ExecutionPolicy:查看都有那些脚本执行策略。
- Set-ExecutionPolicy RemoteSigned:修改脚本执行策略。win10默认是禁止的。必须要管理员权限才能修改。
Powershell调用其他脚本
- 通过bat脚本调用powershell脚本:
@echo off
powershell "&'C:\Users\Administrator\Desktop\test.ps1'"
# &'C:\Users\Administrator\Desktop\test.ps1':&符表示是可执行文件。
Powershell判断操作
- -eq
- -nq
- -gt
- -lt
- -contains
- -notcontains
- -not
- -or
- -and
PS C:\WINDOWS\system32> $a
PS C:\WINDOWS\system32> $a=1gb
PS C:\WINDOWS\system32> $b=3kb
PS C:\WINDOWS\system32> $a -gt $b
True
PS C:\WINDOWS\system32> (1,2,3) -contains 2
True
PS C:\WINDOWS\system32> (1,2,3) -contains 5
False
PS C:\WINDOWS\system32> $result=1gb -gt 3mb
PS C:\WINDOWS\system32> $result
True
Powershell条件判断
- ifeslse
- if ( 2 -gt 3 ) {“yes”} else {“oh,no”}
- if ( 2 -gt 3 ) {“yes”} elseif(2 -gt 1) {“nono”} else {“oh,no”}
- switch
- switch (60){{KaTeX parse error: Expected 'EOF', got '}' at position 9: _ -lt 50}̲ {"小于50"}{_ -gt 50} {“大于50”}}
if ( 2 -gt 3 )
{
"yes"
}
elseif(2 -gt 1)
{
"nono"
}
else
{
"oh,no"
}
$num=56
switch ($num)
{
{($_ -lt 50) and ($_ -gt 40)} {"小于50,大于40"}
{$_ -eq 50} {"等于50"}
{$_ -gt 50} {"大于50"}
}
Powershell循环
- forearch:循环
$arr=1..10
foreach ($n in $arr){$n/2}
foreach ($file in dir C:\中原消金)
{
if ($file.length -gt 1kb) {$file}
}
- while
$num=15
while($num -gt 10)
{
$num
$num=$num-1
}
- do while
$num=15
do {
$num
$num=$num-1
}
while($num -gt 10)
-
break:退出循环
-
continue:退出本次循环,执行下次循环。
$num=15
while($num -gt 10)
{
if ($num%2 -eq 1)
{
$num=$num-1
continue
}
$num
$num=$num-1
}
- for循环
$num=0
for($i=1;$i -le 1000;$i++)
{$num=$num+$i}
$num
Powershell中的数组
- $arr=1,2,3,4,5:声明一个数组
- $arr=1…5:声明一个数组
- $arr=“ipconfig”:声明一个数组
- $arr -is [array]:判断变量是否是数组
- $arr[0]:打印数组中的第一个元素
- $arr[0…2]:打印数组中前三个元素
- $arr.Length:查看数组的长度
- $arr[($arr.Length)…0]:倒叙打印。
- $arr=$arr+“a”:往数组中添加一个元素a。
$arr="ipconfig"
$arr=$arr+"a"
$arr[($arr.Length)..0]
Powershell函数
- function funname () {}:创建一个函数。
- mymessage(“aa”,12):调用函数。
- mymessage “asd” 12:调用函数。
function myping ()
{
ping www.baidu.com
}
function mymessage($name,$age)
{
$content="i am $name,and i am $age years old."
write-host $content
}
- return
function mymessage($name,$age)
{
$content="i am $name,and i am $age years old."
return $content
}
$AA=mymessage "asd" 12
$AA
Powershell定义文本
- “hello powershell.$(get-date)”
- ‘你好:“hello powershell.”’
- “你好:`n`thello powershell.”
- 注意:`:转义字符
Powershell实现用户交互
- Read-Host:从标准输入获取参数。
$input=Read-Host "请输入您的姓名"
"$input,您好...."
Powershell字符串格式化
- format
$name="小小"
$age=25
$body="strong"
"My name is $name,i am $age,and my body is $body."
"My name is {0},i am {1},and my body is {2}." -f $name,$age,$body
- String字符串
$str="https://elasticsearch.cn/question/1197"
$str.Contains('elas')
$attr=$str.Split("/")
$attr[-1]
$str.insert(0,'aaaaaaa')