尝试不要按预期捕获

时间:2016-08-18 21:17:09

标签: powershell try-catch

所以我有这个脚本工作,除非我有一个错误时无法显示计算机名称,我明白这是因为计算机处于脱机状态并且第一个获取computername cmd也是一个错误,但我尝试了多个用一种或另一种不起作用来执行此功能的方法。

obj1 = {
  internal: {}
};

Object.freeze(obj1);
obj1.internal.a = 'aValue';

obj1.internal.a // 'aValue'

// To make obj fully immutable, freeze each object in obj.
// To do so, we use this function.
function deepFreeze(obj) {

  // Retrieve the property names defined on obj
  var propNames = Object.getOwnPropertyNames(obj);

  // Freeze properties before freezing self
  propNames.forEach(function(name) {
    var prop = obj[name];

    // Freeze prop if it is an object
    if (typeof prop == 'object' && prop !== null)
      deepFreeze(prop);
  });

  // Freeze self (no-op if already frozen)
  return Object.freeze(obj);
}

obj2 = {
  internal: {}
};

deepFreeze(obj2);
obj2.internal.a = 'anotherValue';
obj2.internal.a; // undefined

在另一次尝试中,我使用过这个脚本,但下面的这个脚本会将行中的信息格式化而不是像第一个那样格式化列。

gc "\\server\s$\powershellscripts\LabMachines\*.txt" | ForEach-Object{
    Try{   
        $wdt = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $_ -Ea Stop
        $cdt = Get-Content "\\$_\C$\file\*.txt" -Ea Stop
    }
    Catch{
        $wdt= $_
        $cdt = 'Offline or NoFile'
    }
    $wdt | Select @{n='WorkStation';e={$_.PSComputerName}},@{n='Version';e={$cdt}}
} | ogv -Title 'Versions'
$host.enternestedprompt()

任何试图将我的脚本与某人合并的尝试都向我建议“第二个”完全打破它。重申顶部脚本给我格式输出我想要的列,但底部脚本给出了我需要的catch错误“ComputerName Error”,但输出更难以读取行outfile。

有什么建议吗? 感谢。

2 个答案:

答案 0 :(得分:1)

catch块内,$_不再引用管道项,而是引用捕获的错误。

$_分配给其他变量,您可以在catch块中重复使用它:

Get-Content "\\server\s$\powershellscripts\LabMachines\*.txt" | ForEach-Object{
    Try{   
        $ComputerName = $_
        $wdt = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $ComputerName -Ea Stop
        $cdt = Get-Content "\\$_\C$\file\*.txt" -Ea Stop
    }
    Catch{
        $wdt = @{PSComputerName = $ComputerName}
        $cdt = 'Offline or NoFile'
    }
    $wdt | Select @{n='WorkStation';e={$_.PSComputerName}},@{n='Version';e={$cdt}}
}

如果要将其输出到CSV文件,请在最后输入Export-Csv

} |Export-Csv C:\users\public\Desktop\version.csv -NoTypeInformation

答案 1 :(得分:0)

我所以我想用我学到的一些额外的东西扔掉我的成品。在这里。

Function Version {
$i=1
$LabMachines = "\\server\s$\powershellscripts\LabMachines\*.txt" 
$Total = 107 #a manual number for now

Get-Content $LabMachines | ForEach-Object{
   Try{ 
      $ComputerName=$_
      $wdt = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $ComputerName -Ea Stop 
      $cdt = Get-Content "\\$_\C$\file\*.txt" -Ea Stop 
      }
     Catch{
          $wdt = @{PSComputerName = $ComputerName}
          $cdt = 'Offline'
          }
 $wdt | Select @{n='WorkStation';e={$_.PSComputerName}},@{n='Version';e={if($cdt){$cdt}else{"Error with Version.txt"}}} 
                $i++ 
                $percent = [Math]::Round($i / $Total*100) } | Tee-Object -file \\localhost\c$\users\public\desktop\versions.csv | 
                 Select @{n='%Complete';e={if(!($null)){$percent}else{"NULL"}}},
                 @{n='Number';e={if(!($null)){$i}else{"NULL"}}},
                 @{n='Computer';e={if(!($null)){$ComputerName}else{"NULL"}}},
                 @{n='Version';e={if($cdt){$cdt}else{"Error with Version.txt"}}} }

除了上面的答案之外,我所做的更改是它将在控制台中以百分比,数字,计算机名称,版本txt显示进度。我还把它变成了一个函数,所以我们可以运行它并在我们自己的桌面上获取.csv文件。为了更加漂亮,你可以排成一行来计算行数来实现我正在使用的手册号。

非常感谢我学到的帮助。