我正在尝试提取特定文本文件中有错误的计算机列表。我做了以下事情:
$computernames = Get-Content C:\PC.txt
foreach ($server in $computernames)
{
$filepath = Test-Path "\\$server\c$\"
if ($filepath -eq "True") {
Get-Content "\\$server\c$\file.log" | Select-String "Error" -quiet | Select-Object $server
}
}
那是第一台带有错误的计算机,然后是命令窗口中只有一些空行。
如果我尝试在带有out-file或extract等的文件中获取它,我有一个空白文件。
提前感谢您对此事的任何线索。
问候。
答案 0 :(得分:0)
你可以做多件事。让我先告诉你你在寻找什么:
因此,假设您有错误,为了捕获您应该使用try / catch。
替换:
Get-Content "\\$server\c$\file.log" | Select-String "Error" -quiet | Select-Object $server
使用此:
try
{
Get-Content "\\$server\c$\file.log" | Select-String "Error" -quiet | Select-Object $server
}
catch
{
$Error >> ErrorFile.txt
}
第二件事,我建议是。假设您有10台计算机,并且假设第8台计算机出现了一些错误。但是你仍然不希望停止循环并继续循环的其余计算机。在这种情况下,您应该使用2次尝试/捕获:
$computernames = Get-Content C:\PC.txt
try
{
foreach ($server in $computernames)
{
$filepath = Test-Path "\\$server\c$\"
try{
if ($filepath -eq "True") {
try
{
Get-Content "\\$server\c$\file.log" | Select-String "Error" -quiet | Select-Object $server
}
catch
{
$Error >> ErrorFile.txt
}
}
}
catch
{
$_.Exception.Message >> Errorfile.txt
}
}
}
catch
{
$_.Exception.Message >> Errorfile.txt
}
所以方法是,如果foreach中有任何错误,那么内部catch块将捕获它,错误消息将被解析为errorfile.txt,保持循环运行并继续其余的计算机。
如果在获取文件内容时主$ computernames存在问题,那么它将进入主catch块,并在errorfile.txt中解析并附加相应的错误消息
希望它能帮助您理解try / catch的有效性