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-DomainControllercmdlets 只能在 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 等网站的教程学习 |
超级会员免费看
41

被折叠的 条评论
为什么被折叠?



