39、PowerShell 社区扩展实用指南

PowerShell 社区扩展实用指南

1. 路径导航优化

在 PowerShell 中, cd 命令后的空格可以安全省略,示例如下:

PS> cd\
C:\
PS> cd users\hristo
C:\users\Hristo
PS> cd..
C:\Users
PS> cd-
C:\users\Hristo
PS> cd+
C:\Users

需要注意的是, cd\ cd- cd+ cd.. 命令中没有空格。

2. NTFS 辅助功能

自 Windows 2000 发布以来,NTFS 文件系统支持两种特殊类型的文件系统条目:硬链接和目录连接点。

2.1 硬链接

硬链接是将多个文件系统条目与磁盘上的同一数据块关联的一种方式。这些条目看起来像不同的文件,通过其中一个条目修改文件内容会影响所有相关条目。只有当删除的条目是指向该数据的最后一个条目时,删除操作才会删除文件数据;如果还有其他条目,数据将保持完整,仍可通过它们访问。可以使用 New-HardLink cmdlet 创建硬链接,示例如下:

PS> New-Hardlink test-link.txt test.txt
Mode           LastWriteTime       Length Name
----           -------------       ------ ----
-ar--      7/7/2007 11:33 PM            4 test-link.txt
PS> dir
    Directory: Microsoft.PowerShell.Core\FileSystem::Z:\22 - PowerShell Community Extensions\TestFolder
Mode           LastWriteTime       Length Name
----           -------------       ------ ----
-ar--      7/7/2007 11:33 PM            4 test-link.txt
-ar--      7/7/2007 11:33 PM            4 test.txt

test-link.txt 目录条目指向 test.txt 中的数据。要删除该条目,只需将其删除,原始文件不会受到影响。

硬链接的一个主要缺点是无法判断一个文件是否为原始目录条目,因此大多数文件系统(包括 NTFS)不允许对目录创建硬链接,因为无法检测可能导致无限循环的循环引用。

2.2 目录连接点

为了解决硬链接的局限性,NTFS 提供了连接点或目录连接点。连接点类似于硬链接,但仅适用于目录。它们有特殊标记,因此我们始终知道哪个是原始目录。可以使用 New-Junction cmdlet 创建连接点,示例如下:

PS> mkdir folder1
...
PS> New-Junction folder2 folder1
Mode           LastWriteTime       Length Name
----           -------------       ------ ----
d----    12/17/2007 10:15 PM   <JUNCTION> folder2 [Z:\21 - PowerShell Community Extensions\folder1]

该 cmdlet 返回新创建的连接点。删除连接点不安全,因为某些程序会递归删除文件夹,这可能导致删除原始文件而不是连接点本身。要删除连接点,需要使用 Remove-ReparsePoint cmdlet,示例如下:

PS> Remove-ReparsePoint folder2
PS> dir
    Directory: Microsoft.PowerShell.Core\FileSystem::Z:\22 - PowerShell Community Extensions\TestFolder
Mode           LastWriteTime       Length Name
----           -------------       ------ ----
d----     11/7/2007  2:26 AM        <DIR> folder1

连接点是一种特殊的重解析点,因此不需要专门的 Remove-Junction cmdlet 来删除它们。

2.3 符号链接

Windows Vista 为 NTFS 文件系统引入了符号链接支持。符号链接没有硬链接和连接点的限制,可以链接到文件和文件夹,甚至可以跨网络链接到其他位置。可以使用 New-Symlink cmdlet 创建符号链接,但创建符号链接需要提升权限,示例如下:

PS> New-Symlink folder2 folder1
Mode           LastWriteTime       Length Name
----           -------------       ------ ----
d----     11/7/2007  2:34 AM   <SYMLINKD> folder2 [C:\PowerShell\symlink\folder1]

删除符号链接同样使用 Remove-ReparsePoint cmdlet,示例如下:

PS> Remove-ReparsePoint folder2
PS>

3. 文件压缩与归档

PowerShell 本身不支持创建或读取压缩文件和归档文件,但 PSCX 提供了相关功能。

3.1 ZIP 归档

Write-Zip cmdlet 是创建 ZIP 归档文件的重要工具,它至少需要一个源文件夹和一个目标路径,示例如下:

PS> Write-Zip C:\PowerShell PowerShell.zip
Mode           LastWriteTime       Length Name
----           -------------       ------ ----
-a---     11/7/2007  2:45 AM      1089671 PowerShell.zip

该 cmdlet 在执行过程中会显示一个进度条。

3.2 Tar 归档

除了 ZIP 格式,还可以使用 Write-Tar cmdlet 创建 Tar 归档文件,使用方式与 Write-Zip 相同,示例如下:

PS> Write-Tar C:\PowerShell PowerShell.tar
Mode           LastWriteTime       Length Name
----           -------------       ------ ----
-a---     11/7/2007  2:51 AM      4321280 PowerShell.tar

Tar 归档文件通常比 ZIP 文件大,因为 Tar 归档文件不进行压缩。在 UNIX 世界中,通常将归档格式与压缩算法分开。PSCX 提供了两个仅用于压缩的 cmdlet: Write-GZip Write-BZip2 ,分别使用 gzip 和 bzip2 压缩算法对一个或多个文件进行压缩,示例如下:

PS> Write-GZip PowerShell.tar PowerShell.tar.gz
Mode           LastWriteTime       Length Name
----           -------------       ------ ----
-a---     11/7/2007  2:54 AM      2159677 PowerShell.tar.gz
PS> Write-BZip2 PowerShell.tar PowerShell.tar.bz2
Mode           LastWriteTime       Length Name
----           -------------       ------ ----
-a---     11/7/2007  2:55 AM      2180229 PowerShell.tar.bz2

需要注意的是,gzip 和 bzip2 算法不能直接归档多个文件,需要先创建 Tar 归档文件,然后再进行压缩。目前,PowerShell 缺乏解压缩功能,暂时需要使用外部程序进行解压缩操作。

4. 网络实用工具

PSCX 开发者没有忘记自动化任务中的网络部分,提供了对 Windows 网络的良好支持,特别是在处理 Active Directory 方面。

4.1 获取 DHCP 服务器和域控制器信息

如果计算机位于 Windows 网络域中,可以使用 Get-DhcpServer Get-DomainController cmdlets 分别获取 DHCP 服务器和域控制器的信息,示例如下:

PS> Get-DhcpServer
ServerName                                                  Address
----------                                                  -------
win2k3-test.TEST.local                                      192.168.0.1
PS> Get-DomainController
ServerName    : WIN2K3-TEST
DnsHostName   : win2k3-test.TEST.local
Site          : Default-First-Site
Domain        : TEST.local
DN            : CN=WIN2K3-TEST,OU=Domain Controllers,DC=TEST,DC=local
GlobalCatalog : True

如果计算机不是 Windows 域的成员,这两个 cmdlets 将失败。

4.2 网络探测和 DNS 解析

PSCX 还提供了一些小型但实用的网络相关工具,如 Ping-Host Resolve-Host cmdlets。 Ping-Host cmdlet 用于对网络上的计算机进行 ping 测试,返回一个 PingHostStatistics 对象,示例如下:

PS> $pingResults = ping google.com
Pinging google.com with 32 bytes of data:
    Reply from 72.14.207.99 bytes=32 time=149ms TTL=238
    Reply from 72.14.207.99 bytes=32 time=141ms TTL=238
    Reply from 72.14.207.99 bytes=32 time=142ms TTL=238
    Reply from 72.14.207.99 bytes=32 time=144ms TTL=238
PS> $pingResults.MinimumTime
141
PS> $pingResults.MaximumTime
149
PS> $pingResults.Sent
4
PS> $pingResults.Received
4
PS> $pingResults.Loss
0

Resolve-Host cmdlet 用于将 DNS 名称解析为 IP 地址,示例如下:

PS> $result = Resolve-Host google.com
PS> $result.AddressList
IPAddressToString : 64.233.187.99
Address           : 1673259328
AddressFamily     : InterNetwork
ScopeId           :
IsIPv6Multicast   : False
IsIPv6LinkLocal   : False
IsIPv6SiteLocal   : False
IPAddressToString : 72.14.207.99
Address           : 1674513992
AddressFamily     : InterNetwork
ScopeId           :
IsIPv6Multicast   : False
IsIPv6LinkLocal   : False
IsIPv6SiteLocal   : False
IPAddressToString : 64.233.167.99
Address           : 1671948608
AddressFamily     : InterNetwork
ScopeId           :
IsIPv6Multicast   : False
IsIPv6LinkLocal   : False
IsIPv6SiteLocal   : False

4.3 下载网页内容

PSCX 还提供了一个脚本 Get-Url ,用于从 HTTP 服务器下载网页内容,只需提供一个 URL 即可,示例如下:

PS> Get-Url http://www.yahoo.com
<html>
<head>
<title>Yahoo!</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

5. 执行进程和命令

在 PowerShell 中,获取刚启动的进程的引用比较困难。PSCX 提供了 Start-Process cmdlet 解决了这个问题,该 cmdlet 返回刚创建的进程对象,还具有更多功能。

5.1 使用不同用户凭据启动进程

可以使用 Start-Process cmdlet 在不同用户凭据下启动进程,示例如下:

PS> $credentials = Get-Credential
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential
PS> $notepad = Start-Process -Path notepad.exe -Credential $credentials

5.2 传递命令行参数

可以使用 Arguments 参数传递命令行参数,示例如下:

PS> $notepad = Start-Process -path notepad -arguments "C:\PowerShell\test.txt"
PS> $notepad | Stop-Process
PS> $notepad.HasExited
True

5.3 设置进程优先级

可以使用 Priority 参数设置进程的优先级,示例如下:

PS> $notepad1 = Start-Process notepad
PS> $notepad2 = Start-Process notepad -Priority BelowNormal
PS> $notepad1.BasePriority
8
PS> $notepad2.BasePriority
6

5.4 隐藏窗口启动进程

可以使用 -WindowStyle Hidden 参数以隐藏主窗口的方式启动进程,示例如下:

PS> $notepad = Start-Process Notepad -WindowStyle Hidden
PS> $notepad.CloseMainWindow()
False
PS> $notepad.HasExited
False
PS> $notepad | Stop-Process
PS> $notepad.HasExited
True

5.5 提升权限执行命令

为了更方便地以提升的权限运行程序或 shell 命令,PSCX 提供了 elevate 函数,示例如下:

PS> New-Symlink d users
New-Symlink : A required privilege is not held by the client. (Exception from HRESULT: 0x80070522)
At line:1 char:12
+ New-Symlink  <<<< d users
PS> elevate New-Symlink d users
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
      0       0      224         60     2     0.00   3064 powershell

6. XML 工具

PowerShell 通过其类型适配器提供了很好的 XML 支持,但仍有改进空间。

6.1 格式化 XML

Format-Xml cmdlet 可以用于格式化 XML 文件,使其更易于阅读。默认情况下,该 cmdlet 每个缩进级别使用两个空格,可以使用 -Indent 参数指定其他缩进方式,示例如下:

PS> type unformatted.xml
<div class="navBlock">
<h2 class="spot-head">W3C Technical Plenary</h2>
<div class="spot-image">
<a href="http://www.bea.com/">
<img width="120" height="75" alt="BEA logo"
src="/2007/11/TPAC/bea.png" /></a>
</div>
<div class="spot-image">
<a href="http://www.cisco.com/">
<img width="120" height="63"
alt="Cisco logo" src="/2007/11/Cisco-logo.png" /></a>
</div>
</div>
PS> Format-Xml unformatted.xml
<div class="navBlock">
  <h2 class="spot-head">W3C Technical Plenary</h2>
  <div class="spot-image">
    <a href="http://www.bea.com/">
      <img width="120" height="75" alt="BEA logo" src="/2007/11/TPAC/bea.png" />
    </a>
  </div>
  <div class="spot-image">
    <a href="http://www.cisco.com/">
      <img width="120" height="63" alt="Cisco logo" src="/2007/11/Cisco-logo.png" />
    </a>
  </div>
</div>
PS> Format-Xml unformatted.xml -Indent `t > formatted.xml
PS> type formatted.xml
<div class="navBlock">
        <h2 class="spot-head">W3C Technical Plenary</h2>
        <div class="spot-image">
                <a href="http://www.bea.com/">
                        <img width="120" height="75" alt="BEA logo" src="/2007/11/TPAC/bea.png" />
                </a>
        </div>
        <div class="spot-image">
                <a href="http://www.cisco.com/">
                        <img width="120" height="63" alt="Cisco logo" src="/2007/11/Cisco-logo.png" />
                </a>
        </div>
</div>

6.2 XML 验证

Test-Xml cmdlet 可以验证 XML 文件是否格式正确,还可以使用 XML 架构进行验证,示例如下:

PS> type message.xml
<?xml version="1.0"?>
<note
    xmlns="http://www.test.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    >
    <to>Mike</to>
    <from>Jim</from>
    <heading>Reminder</heading>
    <body>Meeting @ 6 PM tomorrow!</body>
</note>
PS> Test-Xml message.xml
True
PS> type message.xsd
<?xml version="1.0"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.test.com"
    xmlns="http://www.test.com"
    elementFormDefault="qualified">
    <xs:element name="note">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="to" type="xs:string"/>
            <xs:element name="from" type="xs:string"/>
            <xs:element name="heading" type="xs:string"/>
            <xs:element name="body" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
PS> type message.xml
<?xml version="1.0"?>
<note
    xmlns="http://www.test.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    >
    <to>Mike</to>
    <from>Jim</from>
    <heading>Reminder</heading>
    <body>Meeting @ 6 PM tomorrow!</body>
    <illegal id="1">element should not be here</illegal>
    <illegal id="2">element2 should not be here</illegal>
</note>
PS> Test-Xml message.xml -SchemaPath message.xsd -Verbose
VERBOSE: Test-Xml processing path 'Z:\22 - PowerShell Community Extensions\message.xml'
VERBOSE: Error: The element 'note' in namespace 'http://www.test.com' has invalid child element 'illegal' in namespace 'http://www.test.com'.
False

6.3 使用 XPath 选择节点

Select-Xml cmdlet 可以使用 XPath 表达式选择 XML 节点,示例如下:

PS> Select-Xml -Path message.xml -XPath "//test:illegal[@id=2]" -Namespace "test=http://www.test.com"
Name                NodeType              OuterXml
----                --------              --------
illegal             Element               <illegal id="2" xmlns="http://www.test.com">element2 should not be here</illegal>

6.4 使用 XSLT 转换 XML

Convert-Xml cmdlet 可以使用 XSLT 转换 XML 文档,示例如下:

PS> type message.xslt
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:test="http://www.test.com">
<xsl:template match="/">
  <html>
    <head>
        <title>Illegal elements</title>
    </head>
  <body>
    <xsl:for-each select="//test:illegal">
        <p style="color: red">
            <xsl:value-of select="."/>
        </p>
    </xsl:for-each>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>
PS> Convert-Xml -path message.xml -XsltPath message.xslt
<html xmlns:test="http://www.test.com">
  <head>
    <title>Illegal elements</title>
  </head>

总结

本文介绍了 PowerShell 社区扩展的多个方面,包括路径导航、NTFS 辅助功能、文件压缩与归档、网络实用工具、执行进程和命令以及 XML 工具等。通过这些扩展功能,可以更方便地完成各种任务,提高工作效率。

流程图:文件压缩与归档流程

graph LR
    A[选择源文件夹] --> B[选择归档格式]
    B --> |ZIP| C[使用 Write-Zip 创建 ZIP 归档]
    B --> |Tar| D[使用 Write-Tar 创建 Tar 归档]
    D --> E{是否需要压缩}
    E --> |是| F[使用 Write-GZip 或 Write-BZip2 压缩 Tar 归档]
    E --> |否| G[完成归档]
    C --> G
    F --> G

表格:常用 cmdlet 总结

功能 cmdlet 示例
创建硬链接 New-HardLink New-Hardlink test-link.txt test.txt
创建目录连接点 New-Junction New-Junction folder2 folder1
创建符号链接 New-Symlink New-Symlink folder2 folder1
创建 ZIP 归档 Write-Zip Write-Zip C:\PowerShell PowerShell.zip
创建 Tar 归档 Write-Tar Write-Tar C:\PowerShell PowerShell.tar
压缩文件 Write-GZip、Write-BZip2 Write-GZip PowerShell.tar PowerShell.tar.gz
获取 DHCP 服务器信息 Get-DhcpServer Get-DhcpServer
获取域控制器信息 Get-DomainController Get-DomainController
网络探测 Ping-Host ping google.com
DNS 解析 Resolve-Host Resolve-Host google.com
下载网页内容 Get-Url Get-Url http://www.yahoo.com
启动进程 Start-Process Start-Process -Path notepad.exe -Credential $credentials
格式化 XML Format-Xml Format-Xml unformatted.xml
XML 验证 Test-Xml Test-Xml message.xml -SchemaPath message.xsd -Verbose
使用 XPath 选择节点 Select-Xml Select-Xml -Path message.xml -XPath "//test:illegal[@id=2]" -Namespace "test=http://www.test.com"
使用 XSLT 转换 XML Convert-Xml Convert-Xml -path message.xml -XsltPath message.xslt

7. 综合应用案例

7.1 自动化文件备份与压缩

假设我们需要定期对某个文件夹进行备份,并将备份文件压缩成 ZIP 格式。可以结合前面介绍的 Start-Process Write-Zip 等 cmdlet 来实现这个自动化任务。以下是一个示例脚本:

# 源文件夹路径
$sourceFolder = "C:\Data\ImportantFiles"
# 备份目标文件夹路径
$backupFolder = "D:\Backups"
# 生成备份文件名
$backupFileName = "Backup_" + (Get-Date -Format "yyyyMMddHHmmss") + ".zip"
$backupPath = Join-Path -Path $backupFolder -ChildPath $backupFileName

# 启动备份进程(使用 Start-Process 可根据需要设置不同参数)
$backupProcess = Start-Process -FilePath "powershell.exe" -ArgumentList "Write-Zip -Path $sourceFolder -OutputPath $backupPath" -PassThru

# 等待备份进程完成
$backupProcess.WaitForExit()

# 检查备份是否成功
if ($backupProcess.ExitCode -eq 0) {
    Write-Host "备份成功:$backupPath"
} else {
    Write-Host "备份失败,退出码:$($backupProcess.ExitCode)"
}

7.2 网络状态监控

我们可以使用 Ping-Host Resolve-Host cmdlet 来监控网络状态,例如定期 ping 某个服务器并解析其 DNS 名称。以下是一个示例脚本:

# 要监控的服务器域名
$serverName = "google.com"

# 循环监控,每 5 分钟执行一次
while ($true) {
    try {
        # 执行 ping 测试
        $pingResults = ping $serverName
        Write-Host "Ping 测试结果:"
        Write-Host "  最小时间:$($pingResults.MinimumTime)ms"
        Write-Host "  最大时间:$($pingResults.MaximumTime)ms"
        Write-Host "  发送包数:$($pingResults.Sent)"
        Write-Host "  接收包数:$($pingResults.Received)"
        Write-Host "  丢包率:$($pingResults.Loss)%"

        # 解析 DNS 名称
        $resolveResult = Resolve-Host $serverName
        Write-Host "DNS 解析结果:"
        foreach ($address in $resolveResult.AddressList) {
            Write-Host "  IP 地址:$($address.IPAddressToString)"
        }
    } catch {
        Write-Host "监控出错:$($_.Exception.Message)"
    }

    # 等待 5 分钟
    Start-Sleep -Seconds 300
}

8. 注意事项与常见问题解答

8.1 NTFS 链接相关

  • 硬链接删除问题 :删除硬链接时,只要还有其他硬链接指向该数据块,数据就不会被删除。但在操作时要注意,避免误删所有指向同一数据的硬链接导致数据丢失。
  • 连接点删除风险 :如前面所述,删除连接点时要使用 Remove-ReparsePoint ,且要谨慎,因为某些程序递归删除可能会删除原始文件夹。
  • 符号链接权限问题 :创建符号链接需要提升权限,在 Windows Vista 及以上系统中,如果没有足够权限,会抛出 A required privilege is not held by the client 错误。可以使用 elevate 函数解决权限问题。

8.2 文件压缩与归档相关

  • 压缩格式选择 :ZIP 格式适合需要压缩的文件,Tar 格式适合只进行归档不压缩的场景。如果需要对 Tar 归档进行压缩,可以使用 Write-GZip Write-BZip2
  • 解压缩缺失问题 :目前 PowerShell 缺乏解压缩功能,暂时需要使用外部程序,如 7-Zip 等。

8.3 网络实用工具相关

  • 域成员限制 Get-DhcpServer Get-DomainController cmdlets 只能在 Windows 域成员计算机上使用,非域成员计算机调用会失败。
  • 网络故障处理 :在使用 Ping-Host Resolve-Host 时,如果出现网络故障,可能会抛出异常,需要在脚本中进行异常处理。

8.4 进程执行相关

  • 隐藏窗口进程关闭问题 :以隐藏窗口方式启动的进程,使用 CloseMainWindow 方法可能无法正常关闭进程,需要使用 Stop-Process 强制终止。
  • 权限提升问题 :使用 elevate 函数提升权限执行命令时,要确保当前用户有足够的权限调用该函数。

8.5 XML 工具相关

  • XPath 命名空间问题 :在使用 Select-Xml 时,如果 XML 文件使用了命名空间,需要通过 -Namespace 参数设置命名空间前缀映射,否则 XPath 表达式可能无法正常工作。
  • XSLT 学习成本 :使用 Convert-Xml 进行 XSLT 转换需要一定的 XSLT 知识,学习 XSLT 可以参考 W3Schools 等网站的教程。

9. 未来发展趋势

随着 PowerShell 社区的不断发展,PowerShell 社区扩展也将不断完善和丰富。未来可能会有以下发展趋势:
- 更多功能扩展 :可能会添加更多的文件处理、网络管理、系统监控等方面的功能,进一步提高 PowerShell 在自动化任务中的应用范围。
- 更好的兼容性 :与更多的操作系统、软件和服务进行兼容,方便在不同环境中使用 PowerShell 进行自动化操作。
- 可视化工具支持 :开发更多的可视化工具,让非专业的 PowerShell 用户也能方便地使用这些扩展功能,降低使用门槛。
- 性能优化 :对现有 cmdlet 进行性能优化,提高执行效率,特别是在处理大量数据和复杂任务时。

总结与展望

PowerShell 社区扩展为 PowerShell 提供了丰富的功能,极大地增强了其在各种场景下的应用能力。通过本文介绍的路径导航、NTFS 辅助功能、文件压缩与归档、网络实用工具、执行进程和命令以及 XML 工具等方面的知识,我们可以更高效地完成各种自动化任务。

在实际使用中,我们需要根据具体需求选择合适的 cmdlet 和工具,并注意相关的注意事项和常见问题。同时,我们也期待 PowerShell 社区扩展在未来能够不断发展,为我们带来更多的便利和惊喜。

流程图:自动化文件备份流程

graph LR
    A[设置源文件夹和备份目标文件夹] --> B[生成备份文件名]
    B --> C[启动备份进程(Write-Zip)]
    C --> D{备份是否成功}
    D --> |是| E[输出备份成功信息]
    D --> |否| F[输出备份失败信息]

表格:常见问题与解决方法总结

问题类型 问题描述 解决方法
NTFS 链接 删除硬链接导致数据丢失 确保有其他硬链接指向同一数据块
NTFS 链接 删除连接点误删原始文件夹 使用 Remove-ReparsePoint 谨慎删除
NTFS 链接 创建符号链接权限不足 使用 elevate 函数提升权限
文件压缩 缺乏解压缩功能 使用外部程序如 7-Zip 进行解压缩
网络工具 非域成员计算机调用域相关 cmdlet 失败 确保计算机加入 Windows 域
进程执行 隐藏窗口进程无法正常关闭 使用 Stop-Process 强制终止
XML 工具 XPath 因命名空间问题无法工作 使用 -Namespace 参数设置命名空间前缀映射
XML 工具 缺乏 XSLT 知识 参考 W3Schools 等网站的教程学习
先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值