2012-11-23 103 views
0

该脚本正常工作,并将切换服务器上的打印机并确定打印机是否共享(TRUE)。但是,如果服务器上的最后一台打印机恰好不被共享,则会出现问题,然后将共享更改为(False)。这在电子表格中歪曲了结果,表明服务器不是打印服务器,尽管它是。我需要做一些如何创建一个循环,指出如果我们在服务器上找到一台共享打印机,请停止搜索并将服务器放入标记为打印服务器的电子表格中。确定服务器是否为打印服务器

我想提出的类似 $Printers = gwmi Win32_Printer -computername $StrComputer if ($printers.shared -eq "True){# then stop searching that machine and place it in the speadsheet as a print server} 这里是我的代码:

foreach ($StrComputer in $colComputers){ 
      $Printers = gwmi Win32_Printer -computername $StrComputer 
      $GenItems1 = gwmi Win32_OperatingSystem -Comp $StrComputer 

    # Populate Printer Sheet with information 
     foreach ($objItem in $GenItems1){ 
      $Sheet1.Cells.Item($intRow, 1) = $StrComputer 
      $Sheet1.Cells.Item($intRow, 2) = $objItem.Caption 
      $Sheet1.Cells.Item($intRow, 3) = $objItem.CSDVersion 
      } 

     foreach ($objItem in $Printers){ 
      $Sheet1.Cells.Item($intRow, 4) = $objItem.Shared 

      } 

     $de = New-Object System.DirectoryServices.DirectoryEntry 
     $ds = New-Object System.DirectoryServices.DirectorySearcher 
     $ds.SearchRoot = $de 
     $ds.Filter = "(&(objectCategory=computer)(objectClass=computer)(samAccountName=$($StrComputer)$))" 
     $ds.SearchScope = "SubTree" 
     $r = $ds.FindOne() 
     $r.Path 
     $Sheet1.Cells.Item($intRow, 5) = $r.Path 

      $intRow = $intRow + 1} 
    } 

回答

1

改变这一点:

foreach ($objItem in $Printers){ 
      $Sheet1.Cells.Item($intRow, 4) = $objItem.Shared 
      } 

与此:

$isprinterserver = $false 
$printers | % { if ($_.shared -eq $true) { $isprinterserver = $true; break} } 
$Sheet1.Cells.Item($intRow, 4) = $isprinterserver 
+0

感谢您的快速回应基督徒。我把代码放在这里,但它不会产生所需的结果。它看起来像挂在第一台服务器上,从不真正产生第一台服务器的真/假结果。 – NobleMan

+0

如果我再次将您的代码放入foreach中,我确实会得到第二台服务器以显示除$ objItem.Shared值之外的所有值。这两个都保持空白。 – NobleMan

+0

当我拿出break命令时,这确实起作用。 – NobleMan