2011-03-31 90 views
1

我有一個奇怪的問題......PowerShell的WMI查詢失敗的任務計劃程序執行時

我有下面的代碼,這需要從Sysinternals的磁盤使用工具的輸出(下面的鏈接)
Disk Usage - Sys Internals

所以首先我將物理驅動器放入數組$ Disks中,然後通過foreach枚舉這些數據,並與它們混淆。

我的問題就出在這行$迪爾= du.exe -q -v $ d.DeviceID

$PC = get-content env:COMPUTERNAME 
$Disk = gwmi win32_logicaldisk -filter "drivetype=3" 

    foreach ($d in $Disk) 
    { 
    $Dir = du.exe -q -v $d.DeviceID 
    $Dir[8..($Dir.length-8)] | foreach { 
    $Size = $_.substring(0,10).replace(",","")/1024 
    $Path = $_.substring(10) 
    } 
} 

$ d.DeviceID應的驅動器盤符(例如C :)

然後我使用DU.exe的輸出填充$ Dir,但是$ d.DeviceID並不是按照它應該如何操作的,從任務運行這個結果有以下結果(添加了一行說$ d.DeviceID,以顯示輸出):

B:
無法索引到空數組中。
在C:\ DU.ps1:25 char:6
+ $ Dir [< < < < 8 ..($ Dir.length-8)] |的foreach {
+ CategoryInfo:InvalidOperation:(System.Object的[]:對象[])[],
的RuntimeException
+ FullyQualifiedErrorId:NullArray

C:
不能索引到一個空數組。
在C:\ DU.ps1:25 char:6
+ $ Dir [< < < < 8 ..($ Dir.length-8)] |的foreach {
+ CategoryInfo:InvalidOperation:(System.Object的[]:對象[])[],
的RuntimeException
+ FullyQualifiedErrorId:NullArray

d:
不能索引到一個空數組。
在C:\ DU.ps1:25 char:6
+ $ Dir [< < < < 8 ..($ Dir.length-8)] |的foreach {
+ CategoryInfo:InvalidOperation:(System.Object的[]:對象[])[],
的RuntimeException
+ FullyQualifiedErrorId:NullArray

從ISE或剛剛從殼牌沒有問題運行它,從所有方法運行在其他服務器上運行。

我相信在$迪爾vairable的人口問題,因爲du.exe具有與$ d.DeviceID

我不明白爲什麼它是有眼前這個服務器/任務sheduler麻煩問題。我試過以下幾種:

重新定義數組元素爲$ i = $ d。設備ID來解決它下降 - 什麼
來自其他服務器(包括DC)的導入導出的工作 - 沒有什麼
重新啓動Winmgmt服務 - 沒有什麼

我認爲這是一個權限問題,但即時通訊上的廣告作爲運行此頂級特權的Dom管理員。

請你們能幫就這一個,真的很卡住...

歡呼

回答

1

然而,基於以下評論其他更新:

嘗試:

$cmd = "du.exe `-q `-v $($d.DeviceID)" 
$dir = Invoke-Expression $cmd 

根據下面的註釋進行更新。

以此爲例。這可以獲取每個文件夾的大小以及文件夾的顯示大小和完整路徑。

Function Get-FolderSize { 
    Param ($folderPath) 
    $colItems = (Get-ChildItem $folderPath -recurse | Measure-Object -property length -sum) 
    return $colItems.sum/1MB 
} 

$folders = Get-ChildItem -Recurse C:\Scripts 
$folders | % { 
    if ($_.PSIsContainer) { 
     $size = Get-FolderSize $_.FullName 
     Write-Host $size 
     Write-Host $_.FullName 
    } 
} 

您可以使用WMI來獲取驅動器盤符,並把它傳遞給腳本。例如:

$disks = gwmi win32_logicaldisk -filter "drivetype=3" 
$disks | % { 
    $items = Get-ChildItem -Recurse $_.DeviceID -Force 
    $items | % { 
     if ($_.PSIsContainer) { 
      $size = Get-FolderSize $_.FullName 
      Write-Host $size 
      Write-Host $_.FullName 
     } 
    } 
} 

因此,您不需要DU.exe。您可以將其作爲腳本運行。

-------------- OLD ANSWER _-------------------

我懷疑的第一件事是DU.exe的路徑。計劃任務上設置的工作目錄是什麼?它是DU.exe可用的地方嗎?

順便說一句,這個腳本的目標是什麼?你只是看着磁盤驅動器的大小?你捕捉到$路徑中的什麼?我沒有耐心來測試你的代碼。但是,我覺得使用WMI和其他外部工具很容易實現。

+0

嗨ravikanth,du.exe位於@ C:\ windows \ system32所以它總是找到,說我已經改變了代碼,以引用整個路徑。它會給我一個不被認可的程序/路徑錯誤。沒有工作目錄集,儘管我認爲這將作爲其Powershell的system32文件夾。腳本的目標是獲取所有驅動器下的每個文件夾路徑,並將其注入到SQL表中,這樣我們就可以在較低級別監視文件夾大小。這是關於目錄大小而不是磁盤空間。 $ Path是目錄路徑文件的一部分。 – 2011-03-31 14:29:17

+0

更新了答案。檢查是否有幫助 – ravikanth 2011-03-31 15:55:52

+0

抱歉需要更具體,我認爲它與powershell interpriting $ d.deviceID作爲輸出到屏幕是好的,但它沒有通過它du.exe正確填寫 – 2011-03-31 16:05:33

相關問題