PowerShell 技能连载 - 创建随机的密码
以下是另一小段用于生成由指定数量的大小写字母、数字,和特殊字符组成的随机密码:
1 | $length = 10 |
以下是另一小段用于生成由指定数量的大小写字母、数字,和特殊字符组成的随机密码:
1 | $length = 10 |
以下是一个有趣的 PowerShell 脚本,名为 Convert-PowerShellToBatch
。将 PowerShell 脚本的路径作为参数传给它,或者将 Get-ChildItem
的执行结果用管道传给它,来批量执行多个脚本。
该函数为每个脚本创建一个批处理文件。当您双击批处理文件时,将执行 PowerShell 代码。
1 | function Convert-PowerShellToBatch |
当您查看某个生成的脚本文件时,您会发现 PowerShell 代码被转换为 BASE64 编码的字符串。所以这种转换适用于许多真实世界的需求:
申明:BASE64 并不是加密。将 BASE64 编码的文本转换为可读的明文是很简单的事。所以这里用的技术不适合用来隐藏秘密,例如密码。
假设您想创建一个函数,接受一个文件路径参数。文件可以进行许多操作。您可能希望拷贝文件,压缩文件,将它们设置为隐藏文件,或其它各种操作。我们在这里并不关注具体需要做什么操作。我们希望关注 PowerShell 函数如何接受文件参数。
您应该遇到过这样的函数:
1 | function Process-File |
结果看起来类似这样:
1 | PS> Process-File -Path C:\windows\explorer.exe |
这个函数每次只处理一个路径。如果希望传入多个路径,您需要这样做:
1 | function Process-File |
现在,您的函数可以接受任意多个逗号分隔的路径。如果您希望也能从管道输入路径呢?需要增加这些代码:
1 | function Process-File |
基本上,您现在有两个嵌套的循环:process {}
是管道对象使用的循环,而其中的 foreach
循环处理用户传入的的字符串数组。
如果您希望 Get-ChildItem
提供路径给函数呢?它并不是返回字符串。它返回的是文件系统对象,而且在对象之内,有一个名为 “FullName” 的属性,存储对象的路径。以下是您要做的:
1 | function Process-File |
现在,这个函数不止能接受管道传来的字符串 (ValueFromPipeline),而且还能接受有某个属性名或别名与参数 (Path) 相似的对象 (ValueFromPipelineByPropertyName)。任务完成了。您的函数现在能够为用户提供最大的灵活性,这基本上也是 cmdlet 所做的事。
WMI 是一个丰富的信息库——如果您知道 WMI 的类名:
1 | Get-CimInstance -ClassName Win32_BIOS |
如果您想探索 WMI 的内容,那么以下代码会十分便利。Find-WmiClass
接受一个简单的关键字,例如 “video”、”network”、”ipaddress”。接下来它可以获取所有类名、某个属性名或方法名包含该关键字的 WMI 类。
1 | function Find-WmiClass |
接下来用户可以选择某个找到的类,该代码将显示这个类的实际实例。
声明:有部分类有几千个实例,例如 CIM_File。当选择了一个有这么多实例的 WMI 类时,该脚本将执行很长时间才能完成。
以下代码查找某个 Active Directory 用户属于哪些组(包括嵌套的组成员)。该代码需要 ActiveDirectory 模块。
1 | #requires -Module ActiveDirectory |
要查找组成员,只需要执行 Get-NestedGroupMember
,跟上用户名即可。该函数和 Get-ADUser
接受同样的身份信息,所以您可以传入 SamAccountName、SID、GUID,或 distinguishedName。
如果您的机器通过不同网络连接,连到了 internet(或 VPN),以下两个函数可能对您有用。
Get-ActiveConnection
列出当前所有获取到 IP 地址的网络连接。Test-ActiveConnection
接受一个关键字并检查是否有一个名字中包含该关键字的活动连接。
1 | function Get-ActiveConnection |
以下是一个快速的演示输出:
1 | PS> Get-ActiveConnection |
Windows 10 附带了各种预装的应用程序和其它特性,这些内容可能是某些人反感。Richard Newton 创建了一个 PowerShell 脚本,用来识别和移除许多预装的特性,并且加强了隐私设置。他在 https://github.com/Sycnex/Windows10Debloater 描述了他的项目。
源码可以在这里找到:https://github.com/Sycnex/Windows10Debloater/blob/master/Windows10Debloater.ps1。
我们向您推荐这个脚本因为它包含了许多有用的技术,演示了在 Windows 10 中如何移除应用和注册表键。当然,不建议在不了解的情况下运行这个脚本。请确保您了解将会移除什么内容,以及您是否真的希望移除它。
在 PowerShell 中没有内置 FTP 命令,但是您可以方便地下载和安装一个免费的扩展,该扩展提供了您想要的 FTP 管理功能。只需要运行这行代码:
1 | PS> Install-Module -Name Posh-SSH -Scope CurrentUser |
如果 PowerShell 无法找到 Install-Module
命令,那么您很有可能没有运行最新版本的 PowerShell (5.1)。请升级您的 PowerShell,或者添加 Microsoft 的 “PowerShellGet” 模块,该模块提供了 Install-Module
命令。
该命令会会从公共的 PowerShell Gallery 下载 Posh-SSH
模块。当您同意下载内容之后,便新增了以下指令:
1 | PS> Get-Command -Module Posh-SSH |
在 powershellmagazine.com 有一篇延伸的文章介绍如何使用这些命令:
在前一个技能中我们介绍了 Get-DisplayFileSize
函数,它可以自动将字节数转换成容易阅读的带单位的数字,例如 “KB” 和 “MB”。
使用 Select-Object
指令,您可以创建一个带有易读的文件尺寸的文件夹列表:
1 | $Length = @{ |
请注意计算属性 Length
仍然可以用于排序。它仍是字节数据,只是显示的方式改变了。
以下 Get-DisplayFileSize
函数接受任何字节数值,并且返回一个以 “MB”、”GB” 或 “PB” 为单位的,格式良好的大小值。
1 | function Get-DisplayFileSize |
以下是一些例子:
1 | PS> Get-DisplayFileSize -Number 800 |
真正有趣的地方是这个函数返回的并不是字符串。它返回的是原始的数值,而只是覆盖了 ToString()
方法。您仍然可以对它进行排序、计算和对比:
1 | PS> $n = 1245646233213 |