2011-03-31 89 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

相关问题