适用于 PowerShell 所有版本
以下是一个简单的系统调用,可以使系统休眠(当然,前提是启用了休眠功能):
function Start-Hibernation
{
rundll32.exe PowrProf.dll, SetSuspendState 0,1,0
}
请注意这个函数调用是大小写敏感的!
适用于 PowerShell 所有版本
以下是一个简单的系统调用,可以使系统休眠(当然,前提是启用了休眠功能):
function Start-Hibernation
{
rundll32.exe PowrProf.dll, SetSuspendState 0,1,0
}
请注意这个函数调用是大小写敏感的!
适用于 PowerShell 3.0 及更高版本
当使用 Get-ChildItem 来列出文件夹内容时,可以用 -Recurse 参数来对子目录进行递归。然而,这导致无法控制递归深度。Get-ChildItem 会在所有子目录中搜索,无限地递归下去。
Get-ChildItem -Path $env:windir -Filter *.log -Recurse -ErrorAction SilentlyContinue
有些时候,我们会见到一种类似这样的方法,来试图控制递归的深度:
Get-ChildItem -Path $env:windir\*\*\* -Filter *.log -ErrorAction SilentlyContinue
然而,这并不能限制只递归 3 层。实际上,它的作用是搜索 3 层及 3 层以上的文件夹。它不会搜索 1 层或 2 层的文件夹。
限制递归深度的唯一办法是自己实现递归算法:
function Get-MyChildItem
{
param
(
[Parameter(Mandatory = $true)]
$Path,
$Filter = '*',
[System.Int32]
$MaxDepth = 3,
[System.Int32]
$Depth = 0
)
$Depth++
Get-ChildItem -Path $Path -Filter $Filter -File
if ($Depth -le $MaxDepth)
{
Get-ChildItem -Path $Path -Directory |
ForEach-Object { Get-MyChildItem -Path $_.FullName -Filter $Filter -Depth $Depth -MaxDepth $MaxDepth}
}
}
Get-MyChildItem -Path c:\windows -Filter *.log -MaxDepth 2 -ErrorAction SilentlyContinue |
Select-Object -ExpandProperty FullName
这段代码将获取您 Windows 文件夹中深度在 2 层以内的 *.log 文件。
适用于所有 PowerShell 版本
新版本的 Windows 操作系统,例如 Windows 8 和 Windows Server 2012 对打印机支持得很好,不过如果您在运行旧版的 Windows,那么这段代码可能有所帮助:
PS> rundll32.exe PRINTUI.DLL,PrintUIEntry
PS>
请注意这段代码是大小写敏感的!请不要加空格,也不要改变大小写。
这段代码将打开一个帮助窗口,列出了许多东西,包括演示如何安装、删除和复制打印机驱动的例子。这个工具也可以远程使用,假设您通过合适的组策略允许远程操作。
适用于所有 PowerShell 版本
在 PowerShell 中执行命令时,别名享有最高的优先权,所以如果遇到了有歧义的命令,PowerShell 将会优先执行别名命令。
这样可能很危险:如果您允许别人更改您的 PowerShell 环境,并且私下添加了您不知道的别名,那么您的脚本执行起来的效果可能完全不同。
Here is a simple call that adds the alias Get-ChildItem and lets it point to ping.exe:
以下是一个简单的例子,创建了一个名为 Get-ChildItem 的别名,并指向 ping.exe:
Set-Alias -Name Get-ChildItem -Value ping
这将导致一切都改变了:Get-ChildItem 不再列出文件夹内容了,而是变为 ping 的行为。甚至,所有的别名(例如 dir 和 ls)现在都指向 ping。我们假想一下如果别名指向了 format.exe,那么您的脚本会做什么?
PowerShell 技能连载 - 转换特殊字符(第二部分)
适用于所有 PowerShell 版本
在前一个技巧中我们演示了如何替换一段文本中的特殊字符。以下是另一种方法,虽然慢一点,但是更容易维护。它也演示了一个大小写敏感的哈希表:
function ConvertTo-PrettyText($Text)
{
$hash = New-Object -TypeName HashTable
$hash.'ä' = 'ae'
$hash.'ö' = 'oe'
$hash.'ü' = 'ue'
$hash.'ß' = 'ss'
$hash.'Ä' = 'Ae'
$hash.'Ö' = 'Oe'
$Hash.'Ü' = 'Ue'
Foreach ($key in $hash.Keys)
{
$Text = $text.Replace($key, $hash.$key)
}
$Text
}
请注意该函数并不是以 @{} 的方式定义一个哈希表,而是构造了一个 HashTable 对象。由于 PowerShell 所带的哈希表是大小写不敏感的,而这个函数创建的哈希表是大小写敏感的。这一点非常重要,因为该函数期望对大小写字母作区分。
PS> ConvertTo-PrettyText -Text 'Mr. Össterßlim'
Mr. Oesstersslim
PS>
如果您想要指定 ASCII 码,以下是一个用 ASCII 码作为键的变体:
function ConvertTo-PrettyText($Text)
{
$hash = @{
228 = 'ae'
246 = 'oe'
252 = 'ue'
223 = 'ss'
196 = 'Ae'
214 = 'Oe'
220 = 'Ue'
}
foreach($key in $hash.Keys)
{
$Text = $text.Replace([String][Char]$key, $hash.$key)
}
$Text
}
PowerShell 技能连载 - 转换特殊字符(第一部分)
适用于所有 PowerShell 版本
有些时候我们需要将特殊字符转换为其它字符。以下是一个实现该功能的小函数:
function ConvertTo-PrettyText($Text)
{
$Text.Replace('ü','ue').Replace('ö','oe').Replace('ä', 'ae' ).Replace('Ü','Ue').Replace('Ö','Oe').Replace('Ä', 'Ae').Replace('ß', 'ss')
}
只要根据需要添加 Replace() 调用来处理文本即可。请注意 Replace() 是大小写敏感的,这样比较好:您可以针对大小写来做替换。
PS> ConvertTo-PrettyText -Text 'Mr. Össterßlim'
Mr. Oesstersslim
适用于所有 PowerShell 版本
别名在交互式 PowerShell 控制台中用起来很酷,但是不应在脚本中使用它们。在脚本中,请使用基础的命令(所以请使用 Get-ChidItem 而不是 dir 或 ls)。
要测试一个脚本,您可以删除所有的别名然后试试脚本是否任然能运行。以下是如何删除特定 PowerShell 会话中的所有别名的方法(它不会影响其它 PowerShell 会话,并且不会永久地删除内置的别名):
PS> Get-Alias | ForEach-Object { Remove-Item -Path ("Alias:\" + $_.Name) -Force }
PS> dir
dir : The term 'dir' is not recognized as the name of a cmdlet, function, script file, or operable
program. Check the spelling of the name, or if a path was included, verify that the path is correct
and try again.
At line:1 char:1
+ dir
+ ~~~
+ CategoryInfo : ObjectNotFound: (dir:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS> Get-Alias
如您所见,所有别名都清空了。现在如果一个脚本使用了别名,它将会抛出一个异常。而关闭并重启 PowerShell 之后,所有内置的别名都恢复了。
适用于所有 PowerShell 版本
虽然您可以轻松地用 New-Alias 和 Set-Alias 来创建新的别名,但是没有一个 cmdlet 可以删除别名。
PS> Set-Alias -Name devicemanager -Value devmgmt.msc
PS> devicemanager
PS>
要删除一个别名,您通常需要重启动您的 PowerShell。或者您可以通过 Alias: 虚拟驱动器删除它们:
PS> del Alias:\devicemanager
PS>
适用于所有 PowerShell 版本
您不必使用额外的 cmdlet 就能在您的活动目录中搜索用户账户或计算机。假设您已登录了一个域,只需要使用这段代码:
$ldap = '(&(objectClass=computer)(samAccountName=dc*))'
$searcher = [adsisearcher]$ldap
$searcher.FindAll()
这段代码将查找所有以“dc”开头的计算机账户。$ldap 可以是任何合法的 LDAP 查询语句。要查找用户,请将“computer”替换为“user”。
适用于 PowerShell 3.0 及以上版本
为了让事情简化一些,您可能希望将 PowerShell 函数存放在一个独立的文件中。要将这些函数加载到您的业务脚本中,您可以使用这个简单的方法:
请确保包含 PowerShell 函数的脚本文件和业务脚本存放在同一个文件夹下。然后,在您的业务脚本中使用这行简单的代码:
. "$PSScriptRoot\library1.ps1"
这行代码将会从当前脚本存放的文件夹中加载一个称为“library1.ps1”的脚本。不要漏了前面的 . 和空格:“点加文件名”的方式执行一个文件,能够确保该文件中的所有变量和函数都在调用者的上下文中定义,并且当脚本执行完以后不会被清除掉。
请注意 $PSScriptRoot 总是指向脚本所在文件夹的路径(从 PowerShell 3.0 开始)。请确保已经保存了您的脚本,因为只有保存过的脚本才有父文件夹。