欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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。可以通过 namename直接引用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')

上一篇:

下一篇: