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

从任务计划程序执行Powershell WMI查询时失败,powershell,permissions,wmi,scheduled-tasks,Powershell,Permissions,Wmi,Scheduled Tasks,我有一个奇怪的问题 我有以下代码,它获取Sysinternals磁盘使用工具(下面的链接)的输出 因此,首先我将物理驱动器放入array$磁盘中,然后通过foreach枚举这些磁盘,并处理它们 我的问题在于这一行$Dir=du.exe-q-v$d.DeviceID $d.DeviceID应为驱动器号(即C:) 然后,我用DU.exe的输出填充$Dir,但是$d.DeviceID没有按预期的方式运行,从任务运行此命令会产生以下结果(添加一行,显示$d.DeviceID的输出): B: 无法索引到

我有一个奇怪的问题

我有以下代码,它获取Sysinternals磁盘使用工具(下面的链接)的输出

因此,首先我将物理驱动器放入array$磁盘中,然后通过foreach枚举这些磁盘,并处理它们

我的问题在于这一行$Dir=du.exe-q-v$d.DeviceID

$d.DeviceID应为驱动器号(即C:)

然后,我用DU.exe的输出填充$Dir,但是$d.DeviceID没有按预期的方式运行,从任务运行此命令会产生以下结果(添加一行,显示$d.DeviceID的输出):

B:
无法索引到空数组。
在C:\DU.ps1:25字符:6

+$Dir[基于以下评论的另一个更新:

尝试:

根据下面的评论进行更新

举个例子,这可以得到每个文件夹的大小,显示文件夹的大小和完整路径

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而不使用其他外部工具来实现。

还有一个基于以下评论的更新:

尝试:

根据下面的评论进行更新

举个例子,这可以得到每个文件夹的大小,显示文件夹的大小和完整路径

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而不使用其他外部工具来实现。

嗨,ravikanth,du.exe位于@C:\windows\system32,所以它总是可以找到,我说已更改代码以引用整个路径。这也会给我一个无法识别的程序/路径错误。没有工作目录集,尽管我认为这将是system32文件夹作为其Powershell。脚本的目标是获取所有驱动器下的每个文件夹路径,并将其注入SQL表中,以便我们可以随时监视文件夹大小低级别。这是关于目录大小而不是磁盘空间。$Path是文件中作为目录路径的行的一部分。更新了答案。检查帮助程序是否需要更具体,我认为这与powershell对$d.deviceID的解释有关,因为输出到屏幕是好的,但它没有正确地将其传递到du.exe以填充我不知道如何在注释框中添加代码。再次更新我的答案!
无法索引到空数组中。在C:\du.ps1:31 char:10+$Dir[Hi ravikanth,du.exe位于@C:\windows\system32,因此它总是被找到,说我已经更改了代码以引用整个路径。这也会给我一个无法识别的程序/路径错误。没有工作目录集,尽管我认为这将是system32文件夹作为其Powershell。脚本的目标是获取每个文件夹所有驱动器下的路径,并将其注入SQL表,以便我们可以在较低级别监控文件夹大小。这是关于目录大小而不是磁盘空间。$path是文件中作为目录路径的行的一部分。更新了答案。检查该帮助器是否需要更具体,我认为这与powershell Interwriting$d.devic有关eID作为屏幕的输出是好的,但它没有正确地将其传递到du.exe以填充HMM。我不知道如何在注释框中添加代码。再次更新我的答案!
无法索引到空数组。在C:\du.ps1:31 char:10+$Dir[