Powershell: вызов скрипта из foreach в другом скрипте не дает желаемого эффекта - PullRequest
1 голос
/ 18 мая 2011

В этом сценарии ниже.Когда я ввожу весь сценарий в командную строку powershell, а затем вызываю его с именем сервера, он работает нормально.Но когда я вызываю его из этого скрипта:

`sl C:\PowershellScripts
 . ./psscript_Get-FreeSpaceFrag.ps1
 $svl = gc 'C:\PowershellScripts\ebi_serverlist.txt'
 $x = {foreach ($s in $svl) {write-host "Getting Disk Info for Server $s" -   
 foregroundcolor "Green"; Get-FreeSpaceFrag $s; start-sleep -s 5; }}
 $x.invoke() | export-csv "C:\PowershellScripts\DiskInfo.csv" -NoTypeInformation`

Это не сработает, а это означает, что файл CSV пуст после того, как он обрабатывает некоторое время.

Function Get-FreeSpaceFrag ($s)
{ 
       trap {write-host "Can't connect to WMI on server $s"  -ForeGroundColor "Red" 
         continue 
} 
 $dt = get-date 
 $Scope = new-object System.Management.ManagementScope "\\$s\root\cimv2" 
 $query = new-object System.Management.ObjectQuery "SELECT * FROM Win32_Volume" 
 $searcher = new-object System.Management.ManagementObjectSearcher $scope,$query 
 $SearchOption = $searcher.get_options() 
 $timeout = new-timespan -seconds 10 
 $SearchOption.set_timeout($timeout) 
 $SearchOption 
 $searcher.set_options($SearchOption) 
 $volumes = $searcher.get() 

        $fr = {foreach ($v in $volumes | where {$_.capacity -gt 0}){ 
        $frag=($v.defraganalysis().defraganalysis).totalPercentFragmentation 
        $v | Add-Member -Name Frag -MemberType NoteProperty -Value $frag -Force -        
        PassThru 
        } } 
       $fr.invoke() | select @{N="Server";E={$_.Systemname}}, DriveLetter, Label,                
       Capacity, FreeSpace, @{N="PercentFree";E={"{0,9:N0}" -f  
       (($_.FreeSpace/1gb)/($_.Capacity/1gb)*100)}}, Frag, @{N="InfoDate";E={$dt}}

 }

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Я думаю, что вы делаете это немного сложнее, чем должно быть, т.е. я не уверен, зачем вам часть кода в аномальном блоке скриптов?Попробуйте вместо этого:

 . ./psscript_Get-FreeSpaceFrag.ps1
Get-Content 'C:\PowershellScripts\ebi_serverlist.txt' | 
    Foreach {Write-Host "Getting Disk Info for Server $_" -foregroundcolor "Green" `
             Get-FreeSpaceFrag $_} |
    Export-Csv "C:\PowershellScripts\DiskInfo.csv" -NoTypeInformation

Не уверен, что это решит проблему, но вы также можете упростить эту часть вашей функции:

$volumes | Where {$_.capacity -gt 0} | Foreach { $_ | Add-Member NoteProperty Frag `
         ($_.defraganalysis().defraganalysis.totalPercentFragmentation) -PassThru} |
  Select @{N="Server";E={$_.Systemname}}, DriveLetter,Label,Capacity,FreeSpace, 
         @{N="PercFree";E={"{0,9:N0}" -f (($_.FreeSpace/1gb)/($_.Capacity/1gb)*100)}},
         Frag, @{N="InfoDate";E={$dt}

Кстати, вместо того, чтобы вызывать скрипт-блок, подобный этому $fr.invoke() канонический способ в PowerShell - использовать оператор вызова следующим образом: &$fr.

0 голосов
/ 18 мая 2011

Может быть ваша проблема в блоке процесса?

 $x = {foreach ($s in $svl) {start-sleep -s 5; 
  write-host "Getting Disk Info for Server $s" -foregroundcolor "Green"; 
  Get-FreeSpaceFrag $s;}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...