繁体   English   中英

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

[英]Powershell WMI Query failing when executed from Task Scheduler

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

我有以下代码,它采用Sysinternals磁盘使用工具的输出(下面的链接)
磁盘使用情况-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的问题

我不明白为什么只有这个服务器/任务管理器才有问题。 我尝试了以下方法:

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

我认为这是一个权限问题,但是我在AD上以具有最高特权的THE DOM管理员身份运行了它。

你们可以帮忙吗,真的卡住了...

干杯

背风处

根据下面的评论还有另一个更新:

尝试:

$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而不使用其他外部工具即可轻松实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM