Сбой запроса Powershell WMI при выполнении из планировщика задач - PullRequest
1 голос
/ 31 марта 2011

У меня странная проблема ...

У меня есть следующий код, который принимает выходные данные из инструмента Sysinternals 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:)

затем я заполняю $ Dir выводом из DU.exe, но $ d.DeviceID работает не так, как должно, выполнение этого из задачи дает следующий результат (добавили строку, в которой написано $ d.DeviceID, показать вывод):

B
Невозможно индексировать в пустой массив.
На C: \ DU.ps1: 25 символов: 6
+ $ Dir [<<<< 8 .. ($ Dir.length-8)] | foreach {<br> + CategoryInfo: InvalidOperation: (System.Object []: Object []) [],
RuntimeException
+ FullyQualifiedErrorId: NullArray

C
Невозможно индексировать в пустой массив.
На C: \ DU.ps1: 25 символов: 6
+ $ Dir [<<<< 8 .. ($ Dir.length-8)] | foreach {<br> + CategoryInfo: InvalidOperation: (System.Object []: Object []) [],
RuntimeException
+ FullyQualifiedErrorId: NullArray

D
Невозможно индексировать в пустой массив.
На C: \ DU.ps1: 25 символов: 6
+ $ Dir [<<<< 8 .. ($ Dir.length-8)] | foreach {<br> + CategoryInfo: InvalidOperation: (System.Object []: Object []) [],
RuntimeException
+ FullyQualifiedErrorId: NullArray

запуск его из ISE или просто из командной оболочки не имеет проблем, запуск его на других серверах из всех методов работает.

Я верю, что проблема в заполнении $ Dir vairable, так как у du.exe есть проблема с $ d.DeviceID

Я не понимаю, почему именно этот сервер / задание имеет проблему. я пробовал следующее:

переопределил элемент массива в $ i = $ d.deviceID, чтобы исправить это - ничего
экспортировал задание с другого сервера (оба контроллера домена) импортированный - ничего
перезапустил службу winmgmt - ничего

Я думаю, что это проблема с разрешениями, но я запускаю это на AD в качестве администратора домена с высшими привилегиями.

пожалуйста, вы, ребята, можете помочь с этим, действительно застрял ...

ура

Lee

1 Ответ

1 голос
/ 31 марта 2011

Еще одно обновление, основанное на комментариях ниже:

Попытка:

$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. Вы можете запустить это как скрипт.

-------------- СТАРЫЙ ОТВЕТ _-------------------

Первое, что я подозреваю, это путь к DU.exe. Какой рабочий каталог установлен для запланированной задачи? Это место, где доступен DU.exe?

Кстати, какова цель этого сценария? Вы просто смотрите на размер диска? Что вы захватываете в $ path? У меня не хватило терпения проверить ваш код. Но я чувствую, что этого легко достичь, используя только WMI и другие внешние инструменты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...