进行数学运算
我们可以把powershell当成一个计算器。象键入命令行那样输入数学表达式,回车,powershell会自动计算并把结果输出。常用的加减乘除模(+,-,*,/,%)运算和小括号表达式都支持。
PS C:\> 2+4+9
15
PS C:\> 0xABCD
43981
PowerShell也能自动识别计算机容量单位,包括KB,MB,GB,TB,PB。
PS C:\> 1pb/1tb
1024
PS C:\> 1tb/1gb
1024
PS C:\> 1gb/1kb
1048576
假如一个网站每个页面大小为80kb,统计显示每天的PV操作为800,1个月下来占用的带宽:
PS C:\> 80kb*800*30/1gb
1.8310546875
假如一个网站的每天人均PV操作为5,页面大小为80Kb,主机提供商限制的总流量为10G,那平均每天的最大访客数
PS C:\> 10GB/(80kb*5)/30
873.813333333333
执行外部命令
Powershell 能够像CMD一样很好的执行外部命令。
通过netstat查看网络端口状态
PS C:\> netstat活动连接协议 本地地址 外部地址 状态TCP 127.0.0.1:5354 DESKTOP-KO2MDTL:49672 ESTABLISHEDTCP 127.0.0.1:5354 DESKTOP-KO2MDTL:49681 ESTABLISHEDTCP 127.0.0.1:27015 DESKTOP-KO2MDTL:49905 ESTABLISHEDTCP 127.0.0.1:49672 DESKTOP-KO2MDTL:5354 ESTABLISHEDTCP 127.0.0.1:49681 DESKTOP-KO2MDTL:5354 ESTABLISHEDTCP 127.0.0.1:49825 DESKTOP-KO2MDTL:49826 ESTABLISHEDTCP 127.0.0.1:49826 DESKTOP-KO2MDTL:49825 ESTABLISHEDTCP 127.0.0.1:49905 DESKTOP-KO2MDTL:27015 ESTABLISHEDTCP 127.0.0.1:50023 DESKTOP-KO2MDTL:50024 ESTABLISHEDTCP 127.0.0.1:50024 DESKTOP-KO2MDTL:50023 ESTABLISHED
...
启动CMD控制台
启动CMD控制台键入cmd或者cmd.exe,退出cmd可以通过命令exit。
PS C:\> cmd
Microsoft Windows [版本 10.0.16299.125]
(c) 2017 Microsoft Corporation。保留所有权利。C:\>exit
查找可用的Cmd控制台命令
Cmd.exe 通过 /c 来接收命令参数,在Cmd中help可以查看可用的命令,所以可以通过Cmd /c help 查找可用的Cmd控制台命令
PS C:\> cmd /c help
有关某个命令的详细信息,请键入 HELP 命令名
ASSOC 显示或修改文件扩展名关联。
ATTRIB 显示或更改文件属性。
BREAK 设置或清除扩展式 CTRL+C 检查。
BCDEDIT 设置启动数据库中的属性以控制启动加载。
CACLS 显示或修改文件的访问控制列表(ACL)。
CALL 从另一个批处理程序调用这一个。
CD 显示当前目录的名称或将其更改。
启动外部程序
为什么可以通过notpad打开记事本,不能通过wordpad打开写字板?
因为notepad.exe位于C:Windows\system32 这个目录,而这个目录已经默认被包含在Powershell的环境变量$env:Path中。
PS C:\> notepad.exe
PS C:\> $env:Path
H:\phpstudy\phpstudy20161103\php\php-5.4.45;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;F:\Git\Git\cmd;F:\svn\bin;E:\BtSoft\ServerAdmin;C:\Users\张三\AppData\Roaming\Composer\vendor\bin;C:\Users\张三\AppData\Local\Microsoft\WindowsApps;C:\GnuWin32\bin
命令集cmdlets
全部命令链接别名
cmdlet 的名称由一个动词和一个名词组成,其功能对用户来讲一目了然。但是对于一个经常使用powershell命令的人每天敲那么多命令也很麻烦啊。能不能把命令缩短一点呢?于是“别名”就应运而生了。Powershell内部也实现了很多常用命令的别名。例如Get-ChildItem,列出当前的子文件或目录。它有两个别名:ls 和 dir,这两个别名来源于unix 的shell和windows的cmd。
因此别名有两个作用:
- 继承:继承unix-shell和windows-cmd。
- 方便:方便用户使用。
处理别名:
查询别名所指的真实cmdlet命令
PS C:\> Get-Alias -Name lsCommandType Name Version Source
----------- ---- ------- ------
Alias ls -> Get-ChildItem
查看可用的别名,可以通过” ls alias:” 或者 ”Get-Alias“
如何查看所有以Remove打头的cmdlet的命令的别名呢?
PS C:\> ls 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
说明:dir alias:获取的是别名的数组,通过where对数组元素进行遍历,$_代表当前元素,alias的Definition为String类型,因为powershell支持.net,.net中的string类有一个方法Startswith。通过where过滤集合在powershell中使用非常广泛。
有的cmdlet命令可能有2-3个别名,我们可以通过下面的命令查看所有别名和指向cmdlet的别名的个数。
PS C:\> ls alias: | Group-Object Definition | sort -Descending CountCount 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}
....
当然你也可以创建、删除、保存自己的别名,在这里就不说,感觉没有必要,有兴趣的朋友可以看我推荐的在线教程。
执行文件和脚本
象运行可执行文件一样,Powershell运行文件和脚本,也必须使用绝对路径或者相对路径,或者要运行的文件必须定义在可受信任的环境变量中。
关于脚本
脚本和批处理都属于伪可执行文件,它们只是包含了若干命令行解释器能够解释和执行的命令行代码。
执行批处理文件
批处理是扩展名为”.bat”的文本文件,它可以包含任何cmd控制台能够处理的命令。当批处理文件被打开,Cmd控制台会逐行执行每条命令。那Powershell能够直接执行批处理吗?
将下列命令保存为ping.bat
@echo off
echo batch File Test
pause
Dir %windir%/system
PS C:\> ./ping
batch file test
请按任意键继续. . .
通过cmd进入cmd控制台输入ping发现执行的不是ping命令,而是直接运行ping.bat ,也就是说可以通过.bat 覆盖cmd命令。这种机制很危险,如果有人侵入电脑,并将系统内部命令篡改成自己批处理,那就太悲剧了。 这种命令与脚本的混淆不会发生在powershell中,因为powershell有更安全的机制。
PS C:\> cmd
Microsoft Windows [版本 10.0.16299.125]
(c) 2017 Microsoft Corporation。保留所有权利。C:\>ping
batch file test
请按任意键继续. . .
执行VB脚本文件
将下列命令保存为test.vbs
Set wmi = GetObject("winmgmts:")
Set collection = wmi.ExecQuery("select * from Win32_Process")
For Each process in collection
WScript.Echo process.getObjectText_
Next
PS C:\> ./test.vbs
执行 ./test.vbs 会遍历当前Win32进程,并把每个进程的详细信息通过窗口显示出来。
在powershell中执行VB脚本
PS C:\PS> cscript.exe test.vbs
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.
instance of Win32_Process
{
Caption = "System Idle Process";
CreationClassName = "Win32_Process";
CSCreationClassName = "Win32_ComputerSystem";
....
执行powershell脚本
Powershell拥有自己的脚本,扩展名为“.ps1”
初次执行脚本时,可能会碰到一个异常:
File ” C:\PS\test.ps1″ cannot be loaded because the
execution of scripts is disabled on this system. Please see
“get-help about_signing” for more details.
At line:1 char:10
+ .test.ps1 <<<<
这是powershell的默认安全设置禁用了执行脚本,要启用这个功能需要拥有管理员的权限。
Powershell调用入口的优先级
别名:控制台首先会寻找输入是否为一个别名,如果是,执行别名所指的命令。因此我们可以通过别名覆盖任意powershell命令,因为别名的优先级最高。
函数:如果没有找到别名,会继续寻找函数,函数类似别名,只不过它包含了更多的powershell命令。因此可以自定义函数扩充cmdlet 把常用的参数给固化进去。
命令:如果没有找到函数,控制台会继续寻找命令,即cmdlet,powershell的内部命令。
脚本:没有找到命令,继续寻找扩展名为“.ps1”的Powershell脚本。
文件:没有找到脚本,会继续寻找文件,如果没有可用的文件,控制台会抛出异常。
The term ‘now’ is not recognized as the name of a cmdlet, function, script file, or operable program. Chec
g of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:4
+ now <<<<
+ CategoryInfo : ObjectNotFound: (now:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
注:我自己也是按照在线教程上的操作的,在一些细节上和教程还是不一样的,大家也要按照自己的实际情况进行调试和学习。关于最后一点的"Powershell拥有自己的脚本",我自己也没有操作。