我的小组正在转移到一个新网络,我们无法直接从网络A中的计算机复制到网络B中的新计算机。在网络A的这台计算机上工作多年后,我已经有了项目文件散布在整个磁盘上。我需要构建一个脚本来将文件夹和文件复制到备份磁盘。没问题,但网络技术人员要求在复制之前知道总字节数。
在CMD中,我使用了来自dir /AD /S /B > C:\Users\r6540\Desktop\UserFiles.txt
的{{1}}来生成大量目录,包括我手动编辑过的大量垃圾。
e.g。
C:\
我从未使用过PowerShell,但看起来这个任务肯定在其能力之内。我发现了这个:
C:\Dev\SSIS
C:\Dev\SSIS\DatabaseCleanup
C:\Dev\SSIS\DatabaseMaintTests
C:\Dev\SSIS\EclipseKeys
C:\Dev\SSIS\TemplateProject
在Microsoft technet以及同一页面:
$startFolder = "C:\Scripts"
$colItems = (Get-ChildItem $startFolder | Measure-Object -property length -sum)
"$startFolder -- " + "{0:N2}" -f ($colItems.sum / 1MB) + " MB"
$colItems = (Get-ChildItem $startFolder -recurse | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object)
foreach ($i in $colItems)
{
$subFolderItems = (Get-ChildItem $i.FullName | Measure-Object -property length -sum)
$i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB"
}
我要查找的输出是目录名称,选项卡和文件夹大小(不包括" MB"如上所示)和CRLF作为写入文本文件的EOL
e.g。
$objFSO = New-Object -com Scripting.FileSystemObject
"{0:N2}" -f (($objFSO.GetFolder("C:\Scripts").Size) / 1MB) + " MB"
任何人都知道PowerShell足以通过UserFiles.txt部署并获得生成的文本文件输出?
表格与功能无关 - 所以如果你能提出另一种方法,我很高兴看到它。
感谢。
答案 0 :(得分:0)
简单的方法是更有效地使用管道
$inputFile = "C:\Users\r6540\Desktop\UserFiles.txt"
$outputFile = "C:\temp\output.txt"
Get-Content $inputFile | ForEach-Object{
$sum = Get-ChildItem $_ -recurse -Force | Measure-Object -property length -sum | Select-Object -ExpandProperty Sum
"{1}`t{0:N2}" -f ($sum / 1MB), $_
} | Set-Content $outputFile
因此,我们采用文件的每一行,并使用您发布的逻辑以MB为单位收集大小。将输出发送到文件。但我们可以稍微改进一下。
$inputFile = "C:\Users\r6540\Desktop\UserFiles.txt"
$outputFile = "C:\temp\output.txt"
$results = Get-Content $inputFile | ForEach-Object{
$props = @{
Folder = $_
Sum = "{0:N2}" -f ((Get-ChildItem $_ -Recurse -Force | Measure-Object -property length -sum | Select-Object -ExpandProperty Sum) / 1MB)
}
New-Object -TypeName PSCustomObject -Property $props
}
$results | Export-CSV $outputFile -NoTypeInformation
"Total,{0}" -f ($results | Measure-Object Sum -sum | Select-Object -ExpandProperty Sum) | Add-Content $outputFile
唯一不同的是,我们制作了很好的CSV输出以及总计被附加到底部,因为在一天结束时也可能很好知道(如果我是来自多个用户的多个副本的收件人我会节省几秒钟的努力。)你可以在循环中保留一个计数器,但是这给你一个机会看到PowerShell在工作。
答案 1 :(得分:0)
这在PowerShell中非常简单:
$objFSO = New-Object -com Scripting.FileSystemObject
Get-Content c:\input.txt |
Foreach { "{0}`t{1:N2}" -f $_, (($objFSO.GetFolder($_).Size) / 1MB) } |
Out-File c:\output.txt -enc ascii
这假设您找到的FileSystemObject脚本有效。 : - )