我需要从多台远程计算机上的日志文件中提取特定的句子。我已经有了所有的计算机名称,但是我不知道如何从文件中提取文件内容并将其全部复制到文件中,这样我就可以从每台计算机的句子中引用其机器名称。基本上,每台机器都有一个自己需要的特定编号。
在进行解释之前,我假设使用powershell作为工具。
大约有1800台机器,所有这些机器都有一个变量。然后,我假定我必须在每个计算机上运行某种循环。
该循环将从我需要的文件中提取文本并将其全部保存到文件中。我的Net Admin职位基本上是新手,没有太多的PowerShell经验,我想知道是否有人可以提供帮助。
$computers = ***list of computers***
$computers | ForEachObject{
Add-Content -Path C:\Users\Public\Activant\Eagle\3log.log -Value "Terminal information for ***need the info that is here***"
}
获取内容-路径。\ TERMINAL NUMBERS.txt
答案 0 :(得分:0)
这似乎可以满足您的要求。 [ grin ]会构建一个脚本块来完成工作,将其移交给Invoke-Command
并附带要运行的系统列表,收集结果,创建{{1}列表},删除由$Non-Responders
cmdlet添加的不需要的属性,最后显示两个集合。
I-C
输出...
#requires -RunAsAdministrator
# fake reading in a text file
# in real life, use Get-Content
$ComputerNameList = @'
LocalHost
10.0.0.1
127.0.0.1
BetterNotBeThere
'@ -split [System.Environment]::NewLine
$IC_ScriptBlock = {
$TargetFileName = 'C:\Temp\Grouping-Strings-List_2019-07-31.log'
# the " \b\w+\b \b\w+\b " is two words delimited by spaces
# so this will find any line that has two words between the listed phrases
$LinePattern = '^Acid Drum \b\w+\b \b\w+\b Psychedelic$'
# the next line is a no-match patern for testing
#$LinePattern = '^Acid Drum \b\w+\b$'
$Line = (Get-Content -LiteralPath $TargetFileName |
Select-String -Pattern $LinePattern).Line
if ([string]::IsNullOrEmpty($Line))
{
$Line = '__Not Found__'
}
[PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
LineText = $Line
}
}
$IC_Params = @{
ComputerName = $ComputerNameList
ScriptBlock = $IC_ScriptBlock
# comment out the next line to see any errors in the I-C call
ErrorAction = 'SilentlyContinue'
}
$Responders = Invoke-Command @IC_Params
$Non_Responders = $ComputerNameList.Where({$_ -notin $Responders.PSComputerName})
# the next line removes unwated properties added by "Invoke-Command"
$Responders = $Responders |
Select-Object -Property * -ExcludeProperty PSComputerName, PSShowComputerName, RunspaceId
$Responders
'=' * 40
$Non_Responders
如果需要,您可以直接从上述两个创建单个集合。 [咧嘴]
答案 1 :(得分:0)
我认为,您要尝试做的是读取列表中所有计算机应具有的文件中的行,该文件位于C:\Users\Public\Activant\Eagle\3log.log
>
在这种情况下,应执行以下操作:
# use UNC naming for the remote file path
$inputFile = 'C$\Users\Public\Activant\Eagle\3log.log' # I'm guessing this is the file you want to read
$outputFile = 'C:\TERMINAL NUMBERS.txt'
$computers = ***list of computers*** # the array of computer names
$result = $computers | ForEach-Object {
# test if the computer is online
if (Test-Connection -ComputerName $_ -Count 1 -Quiet) {
# create the full UNC path by prepending the common file path with the computer name
$file = '\\{0}\{1}' -f $_, $inputFile
# test if the file can be found or not
if (Test-Path -LiteralPath $file -PathType Leaf) {
# using non regex string search
$line = (Select-String -LiteralPath $file -Pattern "whatever you're looking for" -SimpleMatch).Line
if (!$line) {
# the file is there, but the pattern was not found
$line = "Pattern not found"
}
}
else {
$line = "File '$inputFile' not found."
}
}
else {
$line = 'Computer is Off-Line'
}
# Finally, add this info to your text file
Add-Content -Path $outputFile -Value "$_ --> $line"
# And emit an object for the $result collection. This will display nicely on screen,
# but also allow for the creation of a CSV file which might be better as output.
[PsCustomObject]@{
'Computer' = $_
'LogInfo' = $line
}
}
之后,您可以阅读输出文本文件,或者(我认为更好)将$ result集合用于输出:
在屏幕上
$result | Format-Table -AutoSize
到CSV文件
$result | Export-Csv -Path 'C:\TERMINAL NUMBERS.csv' -NoTypeInformation -Force