使用文本文件作为Powershell脚本

时间:2015-07-07 15:41:11

标签: shell powershell batch-file cmd

我的小组正在转移到一个新网络,我们无法直接从网络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部署并获得生成的文本文件输出?

表格与功能无关 - 所以如果你能提出另一种方法,我很高兴看到它。

感谢。

2 个答案:

答案 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脚本有效。 : - )