PowerShell 技能连载 - 冒充 ToString() 方法
在前一个技能当中我们解释了 ToString() 描述一个对象的方法是含糊的,而且对象的作者可以决定 ToString() 返回什么。这在 PowerShell 代码中尤为明显。请看要覆盖任意一个对象的 ToString() 方法是多么容易:
1 | PS> $a = 1 |
PowerShell 技能连载 - 冒充 ToString() 方法
在前一个技能当中我们解释了 ToString() 描述一个对象的方法是含糊的,而且对象的作者可以决定 ToString() 返回什么。这在 PowerShell 代码中尤为明显。请看要覆盖任意一个对象的 ToString() 方法是多么容易:
1 | PS> $a = 1 |
PowerShell 技能连载 - 请注意 ToString() 方法
任何 .NET 对象都有一个 ToString() 方法,返回的是一段文字描述。这也是当您将一个对象输出为一个字符串时所得到的内容。然而,ToString() 所返回的值可能会改变,所以您永远不要使用它来做一些重要的事情。
Here is an example – these lines both produce a FileInfo object which represents the exact same file. Only the way how the object was created is different. All object properties are identical. Yet, ToString() differs:
以下是一个例子——这两行代码都会创建一个 FileInfo 对象,来代表同一个文件。只是创建对象的方法有所不同。所有的对象属性都相同。然而,ToString() 的结果不同:
1 | PS> $file1 = Get-ChildItem $env:windir -Filter regedit.exe |
当您使用 -like 操作符时,它支持三种通配符:”*“ 代表所有数字和字母,”?“ 代表任意单个字符,”[a-z]“ 代表字符的列表。另外有一个不太为人所知的,它支持 PowerShell 的转义字符 “```”,可以用它来转义通配符。
所以当您需要检查一个字符串中的 “*“ 字符,这行代码能够工作但实际上是错的:
1 | '*abc' -like '*abc' |
这是错的,因为它在这种情况下也是返回 true:
1 | 'xyzabc' -like '*abc' |
由于您希望检查 “*“ 字符并且不希望将它解释为一个通配符,所以需要对它进行转义:
1 | PS> '*abc' -like '`*abc' |
而且如果您使用双引号,请不要忘了对转义符转义:
1 | # wrong: |
您可以在一个变量前简单地加上 [Int] 来确保它只包含数字位。但您是否知道从 PowerShell 4.0 开始,支持正则表达式的验证器呢?
通过这种方式,您可以定义一个变量只能为 2 位至 6 位的正数,或其它指定的模式:
1 | PS> [ValidatePattern('^\d{2,6}$')][int]$id = 666 |
PowerShell 技能连载 - 创建随机的 MAC 地址
如果您只是需要一系列随机生成的 MAC 地址,而不关心这些地址是否合法,以下是一行实现代码:
1 | PS> (0..5 | ForEach-Object { '{0:x}{1:x}' -f (Get-Random -Minimum 0 -Maximum 15),(Get-Random -Minimum 0 -Maximum 15)}) -join ':' |
将它加到一个循环中,就可以生成任意多个 MAC 地址:
1 | PS> 0..100 | ForEach-Object { (0..5 | Foreach-Object { '{0:x}{1:x}' -f (Get-Random -Minimum 0 -Maximum 15),(Get-Random -Minimum 0 -Maximum 15)}) -join ':' } |
PowerShell 包含许多不太常用的二进制操作符,例如按位移位。-shl 操作符按位左移指定的位数:
1 | PS> 1 -shl 1 |
以下是将一段二进制文本字符串转为对应的整形值的方法:
1 | $binary = "110110110" |
用另一种方法可以更简单:
1 | PS> [Convert]::ToString(438,2) |
PowerShell 技能连载 - 使用剪贴板来传输数据和结果
终于,在 PowerShell 5 中原生支持将结果发送到剪贴板中,以及从剪贴板中接收结果:
1 | PS> Get-Command -Noun Clipboard |
例如,您可以打开一个包含一些数据的 Excel 表格,将一列复制到剪贴板中,然后在 PowerShell 中进一步处理数据,例如过滤它:
1 | PS> $list = (Get-ClipBoard) -like '*err*' |
PowerShell 技能连载 - 在远程系统中安装 MSI
以下是一些或许对您有用的代码。您需要远程系统的管理员权限。
1 | $ComputerName = 'NameOfMachineToInstall' |
如果权限和网络连接允许,这段代码将在远程系统中安装一个 MSI 包。请在开始之前调整好变量。第一个是需要安装 MSI 的机器名称。第二个是需要安装的 MSI 路径。
PowerShell 技能连载 - .Replace() 和 -replace 的区别
有两种方法可以替换一个字符串中的问本:Replace() 方法,和 -replace 操作符。它们的工作机制是不同的。
Replace() 是大小写敏感的,能够将文本替换为新的文本:
1 | PS> 'Hello World.'.Replace('o', '0') |
-replace 操作符缺省是大小写不敏感的(如果希望大小写敏感,请使用 -creplace)。它接受一个正则表达式输入,很多人忽略了这个功能:
1 | PS> 'Hello World.' -replace 'ell', 'oo' |
第二个输出会让不了解正则表达式的人感到惊讶。如果您希望用 -replace 来替换静态文本,请确保对文本进行转义:
1 | PS> 'Hello World.' -replace [Regex]::Escape('.'), '!' |