当前位置: 代码迷 >> 综合 >> 【PowerShell(3)】——交互式
  详细解决方案

【PowerShell(3)】——交互式

热度:67   发布时间:2023-11-18 00:19:23.0

进行数学运算

我们可以把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拥有自己的脚本",我自己也没有操作。



  相关解决方案