PowerShell 技能连载 - 清空 DNS 缓存
Windows 使用了 DNS 缓存技术,如果改变了 DNS 服务器,您需要刷新 DNS 缓存以使新的设置生效。PowerShell 对传统的控制台命令是有好的,所以只需要在 PowerShell 中运行这行代码:
1 | PS> ipconfig /flushdns |
Windows 使用了 DNS 缓存技术,如果改变了 DNS 服务器,您需要刷新 DNS 缓存以使新的设置生效。PowerShell 对传统的控制台命令是有好的,所以只需要在 PowerShell 中运行这行代码:
1 | PS> ipconfig /flushdns |
PowerShell 对旧的控制台命令是十分友好的,所以要显示文件夹的树形结构,使用旧的 “tree” 命令是十分简单的。它最好工作在一个原生的 PowerShell 控制台中,因为编辑器往往使用不同的字符集。请试试这个命令:
1 | PS> Tree $home |
请确保您是在一个原生的 PowerShell 控制台中或 VSCode 中运行这段代码。您还可以将结果通过管道输出到 clip.exe 并将它粘贴到一个文本文档中:
1 | PS> Tree $home | clip.exe |
在前一个技能中我们介绍了如何用 PowerShell 通过 IANA 下载端口分配信息。这个过程需要 Internet 连接并且需要一段时间。所以以下代码会查找缓存的 CSV 文件。如果缓存文件存在,端口信息会从离线文件中加载,否则将在线加载数据,并写入缓存文件。请特别注意如何使用 Tee-Object
命令创建缓存文件:
1 | $url = 'https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.csv' |
IANA(互联网数字分配机构)维护了一个包含所有已知的端口分配的 CSV 文件。PowerShell 可以为您下载这个列表:
1 | $out = "$env:temp\portlist.csv" |
返回的结果是一个包含所有的端口分配的面向对象格式的列表。接下来您可以使用这个信息例如过滤特定的端口:
1 | Import-Csv -Path $out -Encoding UTF8 | |
PowerShell 提供了 Get-TimeZone
命令,能返回所有定义过的时区和它们的时差。以下是列出世界时钟相关的代码:
1 | $isSummer = (Get-Date).IsDaylightSavingTime() |
结果类似如下:
Dateline Standard Time : 18:41h ()
UTC-11 : 19:41h (Coordinated Universal Time-11)
Aleutian Standard Time : 21:41h (Aleutian Islands)
Hawaiian Standard Time : 20:41h (Hawaii)
Marquesas Standard Time : 21:11h (Marquesas Islands)
Alaskan Standard Time : 22:41h (Alaska)
UTC-09 : 21:41h (Coordinated Universal Time-09)
Pacific Standard Time (Mexico) : 23:41h (Baja California)
UTC-08 : 22:41h (Coordinated Universal Time-08)
Pacific Standard Time : 23:41h ()
US Mountain Standard Time : 23:41h (Arizona)
Mountain Standard Time (Mexico): 00:41h (Chihuahua, La Paz, Mazatlan)
Mountain Standard Time : 00:41h ()
Central America Standard Time : 00:41h (Central America)
Central Standard Time : 01:41h ()
Easter Island Standard Time : 01:41h (Easter Island)
Central Standard Time (Mexico) : 01:41h (Guadalajara, Mexico City, Monterrey)
Canada Central Standard Time : 00:41h (Saskatchewan)
SA Pacific Standard Time : 01:41h (Bogota, Lima, Quito, Rio Branco)
Eastern Standard Time (Mexico) : 02:41h (Chetumal)
Eastern Standard Time : 02:41h ()
以下用 PowerShell 来查看是否使用了夏时制的方法——进行 GMT 计算时可能需要的细节:
1 | (Get-Date).IsDaylightSavingTime() |
只有拥有了管理员特权才可以修改电脑的时间和日期,但任何用户都可以修改时区,例如当您在旅游时。PowerShell 5 提供了一系列非常简单的 cmdlet 来管理时区。首先,检查您的当前设置:
1 | PS> Get-TimeZone |
下一步,尝试修改时区。以下代码打开一个包含所有可用时区的窗口:
1 | PS> Get-TimeZone -ListAvailable | Out-GridView |
当您知道您希望设置的时区的正式 ID 后,请使用 Set-TimeZone
命令。
1 | PS> Set-TimeZone -Id 'Chatham Islands Standard Time' |
在前一个技能中我们掩饰了如何分析一段脚本块的内容并且搜索变量或命令。这种技术也适用于基于文本的脚本。以下脚本将会检查自己并且提取出变量和命令:
1 | $filepath = $PSCommandPath |
请确保将脚本保存到硬盘,或为 $filepath
指定一个不同的实际存在的脚本路径。
要分析一个脚本快中的内容,您可以简单地检查 AST,并且,例如创建一个包含代码中所有变量的清单:
1 | $code = { |
如果您想查看所有的命令,请试试以下代码:
1 | $code = { |
这在根据脚本块自动生成文档的时候非常有用。
如果您需要以固定的频率运行一段 PowerShell 脚本,何不以计划任务的方式运行它呢?以下是一段帮您新建一个每天上午 6 点执行一个 PowerShell 脚本的计划任务的代码:
1 | #requires -Modules ScheduledTasks |