PowerShell 技能连载 - 用 PowerShell 管理 Windows 10 的缺省 APP

Windows 10 缺省安装了一系列 APP,而且即使您手动卸载了它们,它们有可能在下一个重大 Windows 10 更新的时候又回来。

PowerShell 也可以移除这些 Windows 10 APP。您可以在任意时候重新运行脚本,来确保要清除的 APP 确实被删除了。例如这行代码将移除 3D Builder APP:

1
PS> Get-AppxPackage *3dbuilder* | Remove-AppxPackage

有许多类似 http://www.thewindowsclub.com/remove-built-windows-10-apps-users-using-powershell-script 的网站,提供许多更多如何移除特定的 Windows 10 APP 的例子。

PowerShell 技能连载 - 使用神奇的脚本块参数

在前一个例子中我们演示了 Rename-ItemNewName 的神奇功能。它可以接受一个新的文件名,也可以接受一个脚本块。脚本块可以用来批量命名大量文件。

我们现在来看看 PowerShell 函数如何实现这种神奇的参数!以下是一个定义了两个参数的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function Test-MagicFunc
{
[CmdletBinding()]
param
(

[Parameter(Mandatory=$true, Position=0, ValueFromPipeline)]
[string]
$Par1,



[Parameter(ValueFromPipelineByPropertyName)]
[string]
$Par2
)


begin
{
Write-Warning "Starting..."
}

process
{
Write-Warning "Processing Par1=$Par1 and Par2=$Par2"
}

end
{
Write-Warning "Ending..."
}
}

您可以把它当作一个传统的独立函数运行:

1
2
3
4
PS>  Test-MagicFunc -Par1 100 -Par2 50
WARNING: Starting...
WARNING: Processing Par1=100 and Par2=50
WARNING: Ending...

您也可以通过管道输出来运行它,并且传入一个固定的第二参数:

1
2
3
4
5
6
7
PS> 1..4 |  Test-MagicFunc -Par2 99
WARNING: Starting...
WARNING: Processing Par1=1 and Par2=99
WARNING: Processing Par1=2 and Par2=99
WARNING: Processing Par1=3 and Par2=99
WARNING: Processing Par1=4 and Par2=99
WARNING: Ending...

但是您也可以对的第二个参数传入一个脚本块,该脚本块引用了从管道收到的对象:

1
2
3
4
5
6
7
PS> 1..4 |  Test-MagicFunc -Par2 { $_ * $_ }
WARNING: Starting...
WARNING: Processing Par1=1 and Par2=1
WARNING: Processing Par1=2 and Par2=4
WARNING: Processing Par1=3 and Par2=9
WARNING: Processing Par1=4 and Par2=16
WARNING: Ending...

事实证明,这个魔法十分简单:Par2 的参数定义显示它可以接受管道输入。它不关心是由属性名输入 (ValueFromPipelineByPropertyName) 还是通过值输入 (ValueFromPipeline)。在这些例子中,当您将一个脚本块传给参数时,PowerShell 将该脚本块当作管道输入值的接口:$_ 引用输入的对象,脚本块可以使用任何需要的代码来计算需要绑定到参数的值。

PowerShell 技能连载 - 批量重命名图片

重命名单个文件可以很容易地用 Rename-Item 实现,但是有些时候 cmdlet 参数可以更聪明地使用,帮您实现批量自动化。

例如,假设您的照片文件夹中有大量的照片:

1
2
$path = [Environment]::GetFolderPath('MyPictures')
Get-ChildItem -Path $path -Filter *.png

如果您想对它们命名,例如在前面加一个序号,您需要设计一个循环,例如这样:

1
2
3
4
5
6
7
8
9
$path = [Environment]::GetFolderPath('MyPictures')
$counter = 0
$files = Get-ChildItem -Path $path -Filter *.png
$files |
ForEach-Object {
$counter++
$newname = '{0} - {1}' -f $counter, $_.Name
Rename-Item -Path $_.FullName -NewName $newname -WhatIf
}

还有一个简单得多的解决方案:-NewName 参数也可以接受一个脚本块。每当一个元素通过管道传给 Rename-Item,脚本块就会执行一次。代码可以简化为:

1
2
3
4
5
6
7
$path = [Environment]::GetFolderPath('MyPictures')
$counter = 0
$files = Get-ChildItem -Path $path -Filter *.png
$files | Rename-Item -NewName {
$script:counter++
'{0} - {1}' -f $counter, $_.Name
} -WhatIf

还有一处重要的区别:Rename-Item 执行的脚本块是在它自己的作用域中运行的,所以如果您希望使用一个递增的计数器,那么需要在变量名之前增加一个 script:,这样变量就作用在脚本作用域上。

警告:在某些 PowerShell 版本中有一个不友好的 bug,重命名文件将改变 Get-ChildItem 的输出,所以如果您直接将 Get-ChildItem 的结果通过管道传给 Rename-Item,您可能会遇到无限死循环,文件会一直被重命名直到文件路径长度超过限制。要安全地使用它,请确保在将变量传给 Rename-Item 之前将 Get-ChildItem 的结果保存到变量中!

PowerShell 技能连载 - PowerShell 陈列架 dba 工具 – 数据库专家 PowerShell 扩展

在前一个技能中我们解释了如何获取 PowerShellGet 并在您的 PowerShell 版本中运行。现在我们来看看 PowerShell 陈列架能够如何方便地扩展 PowerShell 功能。

PowerShell 是一个多用途的自动化语言,而且世界各地的数据库专家已经开始开发一个名为 “dbatools” 的 PowerShell 扩展,它可以从 PowerShell 陈列架免费地下载:

1
PS> Install-Module dbatools -Scope CurrentUser -Force

当安装完之后,PowerShell 现在拥有了大量新的数据库相关的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
PS> Get-Command -Module dbatools

CommandType Name Version Sou
rce
----------- ---- ------- ---
Alias Attach-DbaDatabase 0.9.332 dba
Alias Backup-DbaDatabaseCertificate 0.9.332 dba
Alias Connect-DbaSqlServer 0.9.332 dba
Alias Copy-SqlAgentCategory 0.9.332 dba
Alias Copy-SqlAlert 0.9.332 dba
Alias Copy-SqlAudit 0.9.332 dba
Alias Copy-SqlAuditSpecification 0.9.332 dba
Alias Copy-SqlBackupDevice 0.9.332 dba
Alias Copy-SqlCentralManagementServer 0.9.332 dba
Alias Copy-SqlCredential 0.9.332 dba
Alias Copy-SqlCustomError 0.9.332 dba
Alias Copy-SqlDatabase 0.9.332 dba
Alias Copy-SqlDatabaseAssembly 0.9.332 dba
Alias Copy-SqlDatabaseMail 0.9.332 dba
Alias Copy-SqlDataCollector 0.9.332 dba
Alias Copy-SqlEndpoint 0.9.332 dba
Alias Copy-SqlExtendedEvent 0.9.332 dba
Alias Copy-SqlJob 0.9.332 dba
Alias Copy-SqlJobServer 0.9.332 dba
Alias Copy-SqlLinkedServer 0.9.332 dba
Alias Copy-SqlLogin 0.9.332 dba
Alias Copy-SqlOperator 0.9.332 dba
Alias Copy-SqlPolicyManagement 0.9.332 dba
Alias Copy-SqlProxyAccount 0.9.332 dba
Alias Copy-SqlResourceGovernor 0.9.332 dba
Alias Copy-SqlServerAgent 0.9.332 dba
Alias Copy-SqlServerTrigger 0.9.332 dba
Alias Copy-SqlSharedSchedule 0.9.332 dba
Alias Copy-SqlSpConfigure 0.9.332 dba
Alias Copy-SqlSsisCatalog 0.9.332 dba
...

这个模块的文档齐备,所以您可以使用 Get-Help 查看每个命令的细节和示例代码。同样地,当您用您喜欢的搜索引擎搜索 “PowerShell + dbatools”,可以找到一个有许多示例和教程的,充满活力的社区。

PowerShell 技能连载 - PowerShell 陈列架:探索脚本块日志(第 2 部分)

在前一个技能中我们介绍了免费的 ScriptBlockLoggingAnalyzer,它覆盖了 PowerShell 日志的代码。默认情况下,它只对一小部分命令有效,但如果您启用了所有脚本块的日志,那么您机器上任何人运行的任何代码都会被记录。

以下是操作步骤(只对 Windows PowerShell 有效,请在提升权限的 PowerShell 中运行!):

1
2
3
4
5
6
7
8
9
10
11
12
13
#requires -RunAsAdministrator

# install the module from the Gallery (only required once!)
Install-Module ScriptBlockLoggingAnalyzer -Force

# enable full script block logging
Enable-SBL

# extend the log size
Set-SBLLogSize -MaxSizeMB 100

# clear the log (optional)
Clear-SBLLog

现在起,这台机器上运行的所有 PowerShell 代码都会被记录。要查看记录的代码,请使用以下代码:

1
PS> Get-SBLEvent | Out-GridView

PowerShell 技能连载 - PowerShell 陈列架:探索脚本块日志(第 1 部分)

在前一个技能中我们解释了如何获取 PowerShellGet 并在您的 PowerShell 版本中运行。现在我们来看看 PowerShell 陈列架能够如何方便地扩展 PowerShell 功能。

脚本块日志是 PowerShell 5 以及之后版本的新功能。当 PowerShell 引擎编译(执行)一个命令,它将命令的执行记录到一个内部的日志文件。默认情况下,只记录了少数被认为与安全性相关的命令。通过一个名为 ScriptBlockLoggingAnalyzer 的免费模块,您可以找到 PowerShell 在您机器上记录日志的代码:

1
2
3
4
5
# install the extension module from the Gallery (only required once!)
Install-Module ScriptBlockLoggingAnalyzer -Scope CurrentUser -Force

# show all logged events
Get-SBLEvent | Out-GridView

请注意 ScriptBlockLoggingAnalyzer 当前只适用于 Windows PowerShell。PowerShell Core 使用相同的机制,但是不同的日志。由于 PowerShell Core 中的日志名称还在开发中,所以您需要手工调整模块来适应 PowerShell Core。

PowerShell 技能连载 - PowerShell 陈列架:创建地理位置二维码

在前一个技能中我们解释了如何获取 PowerShellGet 并在您的 PowerShell 版本中运行。现在我们来看看 PowerShell 陈列架能够如何方便地扩展 PowerShell 功能。

下次您发送会议、上课,或是派对邀请时,为啥不加上一个地理定位的二维码呢?大多数现代的智能设备可以通过它们的相机 APP 扫描这些二维码,并且在地图中显示该地址,且提供如何到达该地址的路径。

创建一个地理位置二维码十分简单,因为困难的部分已经由 QRCodeGenerator 模块实现了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# adjust this to match your own info
$first = "Tom"
$last = "Sawywer"
$company = "freelancer.com"
$email = "t.sawyer@freelancer.com"


# QR Code will be saved here
$path = "$home\Desktop\locationQR.png"

# install the module from the Gallery (only required once)
Install-Module QRCodeGenerator -Scope CurrentUser -Force
# create QR code via address (requires internet access and Google API to work)
New-QRCodeGeolocation -OutPath $path -Address 'Bahnhofstrasse 12, Essen'

# open QR code image with an associated program
Invoke-Item -Path $path

当您在上述例子中传入一个地址,它将自动通过 Google 免费的 API 翻译成经纬度。这可能并不总是起作用,并且需要 Internet 连接。如果您知道您的位置的经纬度,您当然也可以通过 -LatitudeLongitude 参数传入经纬度。

PowerShell 技能连载 - PowerShell 陈列架:创建二维码 vCard

在前一个技能中我们解释了如何获取 PowerShellGet 并在您的 PowerShell 版本中使用。现在我们来看看 PowerShell 陈列架能够多门方便地扩展 PowerShell 的功能。

下次您打印名片的时候,何不增加一个二维码呢?它使得增加联系人十分方便!大多数现代的设备都支持二维码,所以当您将相机 APP 对准一个二位码时,智能手机可以直接向这个联系人发送邮件,或者将他添加为您的联系人。

以下是创建 vCard 二维码的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# adjust this to match your own info
$first = "Tom"
$last = "Sawywer"
$company = "freelancer.com"
$email = "t.sawyer@freelancer.com"


# QR Code will be saved here
$path = "$home\Desktop\vCard.png"

# install the module from the Gallery (only required once)
Install-Module QRCodeGenerator -Scope CurrentUser -Force
# create QR code
New-QRCodeVCard -FirstName $first -LastName $last -Company $company -Email $email -OutPath $path

# open QR code image with an associated program
Invoke-Item -Path $path

PowerShell 技能连载 - PowerShell 陈列架:创建 QR 码

在前一个技能中我们解释了如何获取 PowerShellGet 并且在您的 PowerShell 版本中运行。现在我们看看 PowerShell 陈列架能够多么方便地扩展 PowerShell 的功能。

要创建一个 WiFi 热点的 QR 码,现在只需要几行代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# adjust this to match your own WiFi
$wifi = "myAccessPoint"
$pwd = "topSecret12"


# QR Code will be saved here
$path = "$home\Desktop\wifiaccess.png"

# install the module from the gallery (only required once)
Install-Module QRCodeGenerator -Scope CurrentUser -Force
# create QR code
New-QRCodeWifiAccess -SSID $wifi -Password $pwd -OutPath $path

# open QR code image with an associated program
Invoke-Item -Path $path

这段代码首先下载并安装 QRCodeGenerator 模块,然后生成一个包含您提供的 WiFi 信息的特殊的 QR 码(您需要先调整内容适合您的 WiFi)。

生成的 PNG 图片可以使用大多数现代的智能设备扫描识别,即可使设备连接到 WiFi。

只需要将 QR 码打印几份,下一次迎接客人的时候,只需要提供打印件给客人,他们就可以方便地连上您的 WiFi。

PowerShell 技能连载 - 使用免费的 PowerShell 陈列架(第 2 部分)

PowerShellGet 是一个新的免费的 PowerShell 扩展,用于下载和安装免费的扩展和命令。它随着 PowerShell 5 发布,在前一个技能中我们介绍了如何将它更新到最新版本。

如果您在使用旧版的 PowerShell,建议您最好更新 PowerShell。如果您不方便更新 PowerShell,您可以通过这个免费的 MSI 包安装 PowerShellGet 模块:https://www.microsoft.com/en-us/download/details.aspx?id=51451