我希望修改以下脚本,以便从文本文件导入的唯一IP地址可以转换为单独的CSV文件中的主机名。
Get-ChildItem -Path C:\Logs\Input\ -Filter *.csv |
Get-Content |
Sort-Object -Unique | Sort -desc |
Set-Content -Path C:\LOGS\Unique-$($ColumnNames).txt
输入:
12.34.56.78
111.222.333.444
8.8.8.8
输出:
12.34.56.78 - hosta.domain.com
111.222.333.444 - hostX.net
8.8.8.8 - something wrong
答案 0 :(得分:3)
如果输入和输出文件是CSV,则应使用*-Csv
cmdlet来导入和导出CSV格式的文件。
我假设您想要类似下面的输入和输出。
ips.csv
12.34.56.78
111.222.333.444
8.8.8.8
ips-hostnames.csv
IpAddress,HostName
12.34.56.78,hosta.domain.com
111.222.333.444,hostX.net
8.8.8.8,No such host is known.
$inputDirectory = "C:\Input"
$outputDirectory = "C:\Output"
# Create output directory if it doesn't exist
if (-not(Test-Path -Path $outputDirectory -PathType Container)) {
New-Item -Path $outputDirectory -ItemType Directory
}
# Go through each CSV file in input directory
foreach ($csv in Get-ChildItem -Path $inputDirectory -Filter *.csv -Recurse) {
# Import CSV contents with IpAddress header
$csvFile = Import-Csv -Path $csv.FullName -Header IpAddress
# Get output path of CSV
$csvName = Split-Path -Path $csv.FullName -LeafBase
$csvOutputFileName = "{0}-{1}.csv" -f $csvName, "hostnames"
$csvOutputPath = Join-Path -Path $outputDirectory -ChildPath $csvOutputFileName
# Export to CSV file with IpAddress & HostName headers
& {
foreach ($ip in $csvFile.IpAddress) {
# Attempt to fetch DNS hostname
try {
[PSCustomObject]@{
IpAddress = $ip
HostName = [System.Net.Dns]::GetHostEntry($ip).HostName
}
}
# Could not resolve DNS hostname
catch {
[PSCustomObject]@{
IpAddress = $ip
HostName = $_.Exception.InnerException.Message
}
}
}
} | Export-Csv -Path $csvOutputPath -NoTypeInformation -UseQuotes AsNeeded
}
Import-Csv
导入每个CSV文件的内容,如果CSV文件没有标题(请确定您的输入文件就是这种情况),请确保设置一个标题。ips-hostnames.csv
之类的东西。我们可以将Split-Path
与-LeafBase
结合使用来获取输入CSV的文件名,然后将其与输出目录结合使用Join-Path
创建完整路径。PSCustomObject
来代表输出CSV列。您的IP地址和主机名可以包含2列。[System.Net.Dns]::GetHostEntry
将IP解析为DNS主机名。如果方法无法解析DNS,我们可以将其包装在try/catch
块中以捕获异常,并将主机名条目设置为异常消息。Export-Csv
导出输出CSV文件。