Powershell:在另一个脚本中调用来自foreach的脚本无法获得所需的效果

时间:2011-05-17 22:33:57

标签: powershell

在下面的这个脚本中。当我将整个脚本输入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 个答案:

答案 0 :(得分:1)

我认为你使它比应该更难,即我不确定为什么你需要在一个令人厌恶的脚本块中的部分代码?试试这个:

 . ./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}

BTW而不是调用类似$fr.invoke()这样的脚本块,PowerShell中的规范方法是使用调用运算符,如&$fr

答案 1 :(得分:0)

你可能在进程块中出现问题吗?

 $x = {foreach ($s in $svl) {start-sleep -s 5; 
  write-host "Getting Disk Info for Server $s" -foregroundcolor "Green"; 
  Get-FreeSpaceFrag $s;}}