从任务计划程序执行时,Powershell WMI查询失败

时间:2011-03-31 11:52:15

标签: powershell permissions wmi scheduled-tasks

我有一个奇怪的问题......

我有以下代码,它接受来自Sysinternals Disk Usage工具(下面的链接)的输出 Disk Usage - Sys Internals

所以首先我将物理驱动器放入数组$ Disks中,然后我通过foreach枚举这些并且与它们混乱。

我的问题出在这一行 $ Dir = 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 []:Object [])[],
    RuntimeException的
    + FullyQualifiedErrorId:NullArray

C:
无法索引到空数组 在C:\ DU.ps1:25 char:6
+ $ Dir [<<<< 8 ..($ Dir.length-8)] | foreach {
    + CategoryInfo:InvalidOperation:(System.Object []:Object [])[],
    RuntimeException的
    + FullyQualifiedErrorId:NullArray

d:
无法索引到空数组 在C:\ DU.ps1:25 char:6
+ $ Dir [<<<< 8 ..($ Dir.length-8)] | foreach {
    + CategoryInfo:InvalidOperation:(System.Object []:Object [])[],
    RuntimeException的
    + FullyQualifiedErrorId:NullArray

从ISE或从Shell运行它没有问题,在所有方法的其他服务器上运行它。

我相信$ Dir vairable的人口是问题,因为du.exe遇到了$ d.DeviceID

的问题

我不明白为什么只有这个服务器/任务sheduler有问题。我尝试了以下内容:

将数组元素重新定义为$ i = $ d.deviceID以将其修复 - 没有任何内容 从其他服务器(两个DC)导出作业导入 - 没有任何
重新启动了winmgmt服务 - 没有

我认为这是一个权限问题,但我在AD上运行此作为具有顶级特权的Dom管理员。

请大家帮忙解决这个问题,真的被卡住了......

欢呼声

1 个答案:

答案 0 :(得分: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可用的地方吗?

BTW,这个脚本的目标是什么?你只是看看磁盘驱动器的大小?你在$ path中捕获了什么?我没有耐心测试你的代码。但是,我觉得只使用WMI而不是其他外部工具就可以轻松实现这一目标。