# encoding: ascii # api: powershell # title: WriteFileName # description: Write multiline overwriting messages, typically for iterating through long file names. # version: 0.1 # type: function # author: James Gentile # license: CC0 # x-poshcode-id: 2877 # x-archived: 2012-01-12T06:27:10 # x-published: 2012-07-28T17:31:00 # # # functions to print overwriting multi-line messages. Test script will accept a file/filespec/dir and iterate through all files in all subdirs printing a test message + file name to demostrate. # e.g. PS>.\writefilename.ps1 c:\ # call WriteFileName [string] # after done writing series of overwriting messages, call WriteFileNameEnd function WriteFileName ( [string]$writestr ) # this function prints multiline messages on top of each other, good for iterating through filenames without filling { # the console with a huge wall of text. Call this function to print each of the filename messages, then call WriteFileNameEnd when done # before printing anything else, so that you are not printing into a long file name with extra characters from it visible. if ($Host.Name -match 'ise') { write-host $writestr; return } if ($global:wfnlastlen -eq $null) {$global:wfnlastlen=0} $ctop=[console]::cursortop $cleft=[console]::cursorleft $oldwritestrlen=$writestr.length $rem=$null $writelines = [math]::divrem($writestr.length+$cleft, [console]::bufferwidth, [ref]$rem) #if ($rem -ne 0) {$writelines+=1} $cwe = ($writelines-(([console]::bufferheight-1)-$ctop)) # calculate where text has scroll back to. if ($cwe -gt 0) {$ctop-=($cwe)} write-host "$writestr" -nonewline $global:wfnoldctop=[console]::cursortop $global:wfnoldcleft=[console]::cursorleft if ($global:wfnlastlen -gt $writestr.length) { write-host (" " * ($global:wfnlastlen-$writestr.length)) -nonewline # this only overwrites previously written text if needed, so no need to compute buffer movement on this } $global:wfnlastlen = $oldwritestrlen if ($ctop -lt 0) {$ctop=$cleft=0} [console]::cursortop=$ctop [console]::cursorleft=$cleft } function WriteFileNameEnd ( $switch=$true) # call this function when you are done overwriting messages on top of each other { # and before printing something else. Default switch=$true, which prints a newline, $false restores cursor position same line. if ($Host.Name -match 'ise') { return } if ($global:wfnoldctop -ne $null -and $global:wfnoldcleft -ne $null) { [console]::cursortop=$global:wfnoldctop [console]::cursorleft=$wfnoldcleft if ($global:wfnoldcleft -ne 0 -and $switch) { write-host "" } } $global:wfnoldctop=$null $global:wfnlastlen=$null $global:wfnoldcleft=$null } write-host "Checking: " -nonewline dir $args -recurse -ea 0 -force | %{WriteFileName ("$($_.fullname) ..."*(get-random -min 1 -max 100))} #WriteFileName "Final Test String." WriteFileNameEnd write-host "Done! exiting."