PowerShell 技能连载 - 调用记事本打印文本
适用于 PowerShell 所有版本
若要调用记事本打印纯文本文件,请使用这行代码(请将路径替换成需要的值,否则将打印出长长的系统日志文件):
Start-Process -FilePath notepad -ArgumentList '/P C:\windows\WindowsUpdate.log'
适用于 PowerShell 所有版本
若要调用记事本打印纯文本文件,请使用这行代码(请将路径替换成需要的值,否则将打印出长长的系统日志文件):
Start-Process -FilePath notepad -ArgumentList '/P C:\windows\WindowsUpdate.log'
适用于 PowerShell 所有版本
WMI 可以方便地创建新的共享文件夹。以下是一段创建本地共享文件夹的代码:
$ShareName = 'NewShare'
$Path = 'c:\123'
If (!(Get-WmiObject -Class Win32_Share -Filter "name='$ShareName'"))
{
$Shares=[WMICLASS]"WIN32_Share"
$Shares.Create($Path,$ShareName,0).ReturnValue
}
else
{
Write-Warning "Share $ShareName exists already."
}
如果您有远程机器的管理员权限的话,也可以在远程的机器上创建共享文件夹。只需要像这样使用完整 WMI 即可:
$ShareName = 'NewShare'
$Path = 'c:\123'
$Server = 'MyServer'
If (!(Get-WmiObject -Class Win32_Share -Filter "name='$ShareName'"))
{
$Shares=[WMICLASS]"\\$Server\root\cimv2:WIN32_Share"
$Shares.Create($Path,$ShareName,0).ReturnValue
}
else
{
Write-Warning "Share $ShareName exists already."
}
适用于 PowerShell 所有版本
也许您有时候希望 PowerShell 脚本在后台运行,例如复制文件时,但又不希望脚本抢占过多 CPU 或干预其它任务。
一种减慢 PowerShell 脚本运行速度的方法是降低它们的优先级。以下是一个实现该效果的函数:
function Set-Priority
{
[CmdletBinding()]
param
(
[Parameter(Mandatory=$true)]
[System.Diagnostics.ProcessPriorityClass]
$Priority
)
$process = Get-Process -Id $pid
$process.PriorityClass = $Priority
}
要降低脚本的优先级,请这样调用:
Set-Priority -Priority BelowNormal
您可以稍后将优先级调回 Normal,甚至可以调高优先级使脚本获得更多资源执行。例如需要执行更重的任务,不过这会使 UI 响应性变得更差。
适用于 PowerShell 所有版本
当您使用 Get-PfxCertificate
命令时,您可以读取 PFX 证书文件,并使用证书来为脚本签名。然而,该命令总是交互式地询问证书的密码。
以下这段代码可以通过脚本来提交密码:
$PathToPfxFile = 'C:\temp\test.pfx'
$PFXPassword = 'test'
Add-Type -AssemblyName System.Security
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import($PathToPfxFile, $PFXPassword, 'Exportable')
$cert
适用于 PowerShell 所有版本及 SQLServer
您在使用 SQL Server 吗?以下是一段可以进行 SQL 查询并获取数据的 PowerShell 脚本模板。只需要确保填写了正确的用户信息、服务器地址和 SQL 语句即可:
$Database = 'Name_Of_SQLDatabase'
$Server = '192.168.100.200'
$UserName = 'DatabaseUserName'
$Password = 'SecretPassword'
$SqlQuery = 'Select * FROM TestTable'
# Accessing Data Base
$SqlConnection = New-Object -TypeName System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Data Source=$Server;Initial Catalog=$Database;user id=$UserName;pwd=$Password"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$set = New-Object data.dataset
# Filling Dataset
$SqlAdapter.Fill($set)
# Consuming Data
$Path = "$env:temp\report.hta"
$set.Tables[0] | ConvertTo-Html | Out-File -FilePath $Path
Invoke-Item -Path $Path
适用于 PowerShell 所有版本
要将结果转换为彩色的自定义报告,只需要定义三个脚本块:一个生成 HTML 文档的头部,另一个生成尾部,还有一个对报表中的列表做循环,针对每一个列表项做处理。
然后,将这些脚本块传递给 ForEach-Object
。它接受一个 begin
、一个 process
和一个 end
脚本块。
以下是一个示例代码,演示了如何创建一个彩色的服务状态报表:
$path = "$env:temp\report.hta"
$beginning = {
@'
<html>
<head>
<title>Report</title>
<STYLE type="text/css">
h1 {font-family:SegoeUI, sans-serif; font-size:20}
th {font-family:SegoeUI, sans-serif; font-size:15}
td {font-family:Consolas, sans-serif; font-size:12}
</STYLE>
</head>
<image src="http://www.yourcompany.com/yourlogo.gif" />
<h1>System Report</h1>
<table>
<tr><th>Status</th><th>Name</th></tr>
'@
}
$process = {
$status = $_.Status
$name = $_.DisplayName
if ($status -eq 'Running')
{
'<tr>'
'<td bgcolor="#00FF00">{0}</td>' -f $status
'<td bgcolor="#00FF00">{0}</td>' -f $name
'</tr>'
}
else
{
'<tr>'
'<td bgcolor="#FF0000">{0}</td>' -f $status
'<td bgcolor="#FF0000">{0}</td>' -f $name
'</tr>'
}
}
$end = {
@'
</table>
</html>
</body>
'@
}
Get-Service |
ForEach-Object -Begin $beginning -Process $process -End $end |
Out-File -FilePath $path -Encoding utf8
Invoke-Item -Path $path
适用于 PowerShell 所有版本
PowerShell 可以有多种方法作出限制。一种是将语言模式从 FullLanguage
改为 RestrictedLanguage
。这是一种无法撤销的方法,最坏可以关闭并重开 PowerShell:
$host.Runspace.SessionStateProxy.LanguageMode = 'RestrictedLanguage'
一旦设置成 RestrictedLanguage
,PowerShell 将只能执行指令。它将再也无法执行对象的方法或存取对象的属性,并且您也无法定义新的函数。
所以 RestrictedLanguage
基本上是一个安全的锁,锁定以后 PowerShell 只能执行指令但无法深入到底层的 .NET 或用新创建的函数覆盖现有的命令。
适用于 PowerShell 所有版本
PowerShell 将所有可执行程序(扩展名为 EXE 的文件)视为普通的命令。您甚至可以限制 PowerShell 不能执行任何可执行程序或只能执行白名单内的程序。
缺省的设置是允许任何 EXE 执行:
PS> $ExecutionContext.SessionState.Applications
*
该设置为仅允许 ping.exe
和 regedit.exe
执行:
$ExecutionContext.SessionState.Applications.Clear()
$ExecutionContext.SessionState.Applications.Add('ping.exe')
$ExecutionContext.SessionState.Applications.Add('regedit.exe')
以下是结果:
PS> $ExecutionContext.SessionState.Applications
ping.exe
regedit.exe
显然地,您可以轻松地将设置恢复到缺省状态:
PS> $ExecutionContext.SessionState.Applications.Add('*')
PS> explorer
PS>
所以,该设置可以使执行 EXE 程序变得更困难(或者说防止不小心运行了不该运行的 EXE)。若真要将它作为安全策略,您还需要关闭所谓的“语言模式”。
当语言模式关闭时,您无法直接存取 .NET 对象。这意味着您无法在当前的 PowerShell 会话中回退该操作。我们将在明天详细介绍语言模式设置。
适用于 PowerShell 3.0 及以上版本
PowerShell 内部的类型扩展系统的作用是负责将对象转换为文本。它的实现方法是通过查询一个名为“PSTypeName”的属性。您可以为自定义的对象添加这个属性来模拟其它对象类型并使 ETS 用相同方式显示该对象:
$object = [PSCustomObject]@{
ProcessName = 'notepad'
ID = -1
PSTypeName = 'System.Diagnostics.Process'
}
The object pretends to be a process object, and ETS will format it accordingly:
PS> $object
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
0 0 0 0 -1 notepad
PS>
用这段代码可以获取所有支持管道的 PowerShell 命令:
Get-Command -CommandType Cmdlet | Where-Object {
$_.Parameters.Values | Where-Object {
$_.Attributes.ValueFromPipeline
}
}