PowerShell 技能连载 - 查找最重要的错误系统日志

如果您没有充裕的时间来调查您系统日志中出现频率最高的错误来源,请试试这行代码:

Get-EventLog -LogName System -EntryType Error, Warning |
 Group-Object -Property Source |
 Sort-Object -Property Count -Descending

当您找到导致一系列错误(或警告)的源头时,这行代码可以显示错误的细节:

# change this variable to the name of the source you want
# to explore:
$source = 'Schannel'
Get-EventLog -LogName System -Source $source |
  Out-GridView

PowerShell 技能连载 - 刷新新挂载的磁盘

如果您的脚本刚刚挂载了一个新的驱动器,PowerShell 可能无法立即存取它(例如通过 Get-ChildItem),因为 Powerell 尚未更新它的驱动器列表。

要更新 PowerShell 驱动器列表,请用这行代码:

$null = Get-PSDrive

PowerShell 技能连载 - 从 PSSnapin 中加载 cmdlet

近期多数 cmdlet 都是包装在模块中。模块是从 PowerShell 2.0 开始引入的概念。它们的主要好处是可以复制粘贴部署(不需要安装)以及模块自动加载(当您需要时,PowerShell 将自动加载模块)。

有一些 cmdlet 还是用 PowerShell snap-in (PSSnapin) 的方式包装,而不是采用模块的方式包装。PSSnapin 是从 PowerShell 1.0 就开始引入的。PSSnapin 需要安装才能使用。而且由于它们是注册在 HKEY_LOCAL_MACHINE 中,所以它们安装时往往需要管理员权限。

要列出所有可用的 PSSnapin,请运行这行代码:

Get-PSSnapin -Registered

与模块相对,PSSnapin 需要先手动加载,才能使用其中的 cmdlet。这行代码将会加载所有可用的 PSSnapin:

Get-PSSnapin -Registered | Add-PSSnapin -Verbose

PowerShell 技能连载 - 加载 PowerShell 模块

所有的 cmdlet 都位于模块或是 snap-in 中。要查看当前加载了哪些模块,请使用 Get-Module 命令。

在 PowerShell 3.0 或更高版本中,当您运行多数模块中的 cmdlet 时,它们都将被隐式地导入。这种聪明的机制实现了“按需加载”的效果,所以在多数情况下不需要手动加载模块,或是显式地手动加载所有模块。

要关闭自动加载,请使用这行代码:

$PSModuleAutoLoadingPreference = 'none'

请注意当您这么做的时候,您有责任加载所有需要的模块。

如果您希望加载所有可用的模块,请使用 Import-Module 命令。

这将读取您整个系统中所有可用的模块:

Get-Module -ListAvailable | Import-Module -Verbose

PowerShell 技能连载 - 如何查找包含指定参数的命令

Get-Command 是当您需要查找某个命令来完成一件事情时的主要工具。

您可以这样搜索动词和/或名词:

# find all cmdlets/functions that stop things
Get-Command -Verb Stop
# find all cmdlets/functions that affect services
Get-Command -Noun Service

从 PowerShell 3.0 开始,Get-Command 还可以根据一个给定的参数查找 cmdlet 或函数:

# new in PS3 and better
# find all cmdlets/functions with a -ComputerName parameter
Get-Command -ParameterName ComputerName

请注意 Get-Command 是在已加载的 cmdlet/函数中搜索。请确保在搜索前已导入了所需的模块。

PowerShell 技能连载 - 获取 CPU 核心和处理器信息

通过一行 WMI 代码,就可以查看您的 CPU 详情:

PS> Get-WmiObject -Class Win32_Processor | Select-Object -Property Name, Number*

Name                                    NumberOfCores NumberOfLogicalProcessors
----                                    ------------- -------------------------
Intel(R) Core(TM) i7-26...                          2                         4

PowerShell 技能连载 - 安装 Windows 功能

在服务器中,Powershell 可以通过 Install-WindowsFeature 命令安装 Windows 功能。

若您将 Install-WindowsFeature 返回的结果保存下来,则可以用 Get-WindowsFeature 查看安装的状态:

# install features on server and save result in $result
Install-WindowsFeature -Name AD-Domain-Services, DNS -IncludeManagementTools -OutVariable result -Verbose

# view the result of your change
Get-WindowsFeature -Name $result.FeatureResult.Name

PowerShell 技能连载 - 创建动态脚本块

脚本块是一段可执行的 PowerShell 代码。您通常可以将语句包裹在大括号中创建脚本块。

若要在脚本中动态创建脚本块,以下是将一个字符串转换为脚本块的方法。

$scriptblock = [ScriptBlock]::Create('notepad')

通过这种方法,您的代码首先以字符串的形式创建代码,然后将字符串转换为脚本块,然后将脚本块传递给您需要的 cmdlet(例如 Invoke-Command):

PS> Invoke-Command -ScriptBlock 'notepad'
Cannot convert  the "notepad" value of type "System.String" to type
"System.Management.Automation.ScriptBlock". (raised by:  Invoke-Command)

PS> Invoke-Command -ScriptBlock ([ScriptBlock]::Create('notepad'))

PowerShell 技能连载 - 管理 NTFS 权限继承

缺省情况下,文件和文件夹从它们的父节点继承权限。要停用继承,并且只保留显式权限,请做以下两件事情:增加你需要显式权限,然后禁止继承。

这个示例代码创建了一个名为“_PermissionNoInheritance_”的文件夹,然后为当前用户赋予读权限,为管理员组赋予完整权限,并且禁止继承。

# create folder
$Path = 'c:\PermissionNoInheritance'
$null = New-Item -Path $Path -ItemType Directory -ErrorAction SilentlyContinue

# get current permissions
$acl = Get-Acl -Path $path

# add a new permission for current user
$permission = $env:username, 'Read,Modify', 'ContainerInherit, ObjectInherit', 'None', 'Allow'
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permission
$acl.SetAccessRule($rule)

# add a new permission for Administrators
$permission = 'Administrators', 'FullControl', 'ContainerInherit, ObjectInherit', 'None', 'Allow'
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permission
$acl.SetAccessRule($rule)

# disable inheritance
$acl.SetAccessRuleProtection($true, $false)

# set new permissions
$acl | Set-Acl -Path $path

PowerShell 技能连载 - 移除非继承的 NTFS 权限

在前一个例子中,我们演示了如何向已有的文件夹添加新的 NTFS 权限。如果您希望重置权限并且移除所有之前所有非继承的 NTFS 权限,以下是示例代码:

# make sure this folder exists
$Path = 'c:\sampleFolderNTFS'

# get explicit permissions
$acl = Get-Acl -Path $path
$acl.Access |
  Where-Object { $_.isInherited -eq $false } |
  # ...and remove them
  ForEach-Object { $acl.RemoveAccessRuleAll($_) }

# set new permissions
$acl | Set-Acl -Path $path