Lee Hill
Lee Hill

Reputation: 11

Powershell WMI Query failing when executed from Task Scheduler

i have a strange problem...

i have the following code, which takes the output from Sysinternals Disk Usage tool (link below)
Disk Usage - Sys Internals

so first i get the physical drives into array $Disks, then i enumerate these through the foreach and mess about with them.

my problem lies in this line $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 should be the drive letter (i.e. C:)

then i populate $Dir with the output from DU.exe, but $d.DeviceID is not acting how it is supposed to, running this from a task has this following result (added a line that says $d.DeviceID, to show the output):

B:
Cannot index into a null array.
At C:\DU.ps1:25 char:6
+ $Dir[ <<<< 8..($Dir.length-8)] | foreach {
+ CategoryInfo : InvalidOperation: (System.Object[]:Object[]) [],
RuntimeException
+ FullyQualifiedErrorId : NullArray

C:
Cannot index into a null array.
At C:\DU.ps1:25 char:6
+ $Dir[ <<<< 8..($Dir.length-8)] | foreach {
+ CategoryInfo : InvalidOperation: (System.Object[]:Object[]) [],
RuntimeException
+ FullyQualifiedErrorId : NullArray

D:
Cannot index into a null array.
At C:\DU.ps1:25 char:6
+ $Dir[ <<<< 8..($Dir.length-8)] | foreach {
+ CategoryInfo : InvalidOperation: (System.Object[]:Object[]) [],
RuntimeException
+ FullyQualifiedErrorId : NullArray

running it from the ISE or just from the Shell has no issues, running it on other servers from all methods works.

i do believe the population of the $Dir vairable is the problem, as the du.exe has trouble with the $d.DeviceID

i dont understand why it is just this server/task sheduler that has the issue. i have tried the following:

redefined the array element to $i = $d.deviceID to fix it down - nothing
exported the job from other server (both DCs) an imported - nothing
restarted the winmgmt service - nothing

i think its a permissions issue, but im running this on an AD as THE Dom Admin with top privilages.

please can you guys help on this one, really am stuck...

cheers

Lee

Upvotes: 1

Views: 1271

Answers (1)

ravikanth
ravikanth

Reputation: 25810

Yet another update based on comment below:

Try:

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

Updating as per the comment below.

Take this example. This can get the size of every folder and display size and full path to the folder.

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

You can use WMI to get the drive letter and pass it to the script. For example:

$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
        }
    }
}

So, with this, you dont need DU.exe. You can run this as a script.

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

First thing I would suspect is the path to DU.exe. What is the working directory set on the scheduled task? Is it the place where DU.exe is available?

BTW, what is the goal of this script? Are you just looking at the disk drive size? What are you capturing into $path? I did not have the patience to test your code. But, I feel that this can be easily achieved using just WMI and no other external tools.

Upvotes: 1

Related Questions