我有一个奇怪的问题......
我有以下代码,它接受来自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管理员。
请大家帮忙解决这个问题,真的被卡住了......
欢呼声
利
答案 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而不是其他外部工具就可以轻松实现这一目标。