我正在尝试构建一个脚本,向我提供有关命令行进度的反馈。实际上它只是为每个第n个进度步骤设置换行符。控制台看起来像
10:30:00 Parsed 0 of 1'000'000 data entries (0 %)
10:30:10 Parsed 1'000 of 1'000'000 data entries (1 %)
10:30:20 Parsed 2'000 of 1'000'000 data entries (2 %)
[...] etc [...]
11:00:00 Parsed 1'000'000 of 1'000'000 data entries (100 %)
即使时间戳和进度数字是虚构的,你也应该看到问题。
我想要的是“wget
- style”,在命令行上更新了进度条,并考虑了线宽。
首先,我想到了诅咒的使用,因为我在尝试学习C时有手,但我从来没有对它感到温暖,我认为它只是为了操纵几行而臃肿。我也不需要任何着色。我发现的大多数其他图书馆似乎都专门用于着色。
有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
前段时间我创建了一个类作为状态文本,您可以在其中更改行内文本的部分内容。它可能对你有用。
使用示例的类是:
class StatusText
def initialize(parms={})
@previous_size = 0
@stream = parms[:stream]==nil ? $stdout : parms[:stream]
@parms = parms
@parms[:verbose] = true if parms[:verbose] == nil
@header = []
@onChange = nil
pushHeader(@parms[:base]) if @parms[:base]
end
def setText(complement)
text = "#{@header.join(" ")}#{@parms[:before]}#{complement}#{@parms[:after]}"
printText(text)
end
def cleanAll
printText("")
end
def cleanContent
printText "#{@parms[:base]}"
end
def nextLine(text=nil)
if @parms[:verbose]
@previous_size = 0
@stream.print "\n"
end
if text!=nil
line(text)
end
end
def line(text)
printText(text)
nextLine
end
#Callback in the case the status text changes
#might be useful to log the status changes
#The callback function receives the new text
def onChange(&block)
@on_change = block
end
def pushHeader(head)
@header.push(head)
end
def popHeader
@header.pop
end
def setParm(parm, value)
@parms[parm] = value
if parm == :base
@header.last = value
end
end
private
def printText(text)
#If not verbose leave without printing
if @parms[:verbose]
if @previous_size > 0
#go back
@stream.print "\033[#{@previous_size}D"
#clean
@stream.print(" " * @previous_size)
#go back again
@stream.print "\033[#{@previous_size}D"
end
#print
@stream.print text
@stream.flush
#store size
@previous_size = text.gsub(/\e\[\d+m/,"").size
end
#Call callback if existent
@on_change.call(text) if @on_change
end
end
a = StatusText.new(:before => "Evolution (", :after => ")")
(1..100).each {|i| a.setText(i.to_s); sleep(1)}
a.nextLine
只需复制,粘贴到ruby文件中即可试用。我使用转义序列来重新定位光标。
该类具有我当时需要的许多功能(如堆积状态栏中的元素),可用于补充解决方案,或者您可以将其清理到其核心。
我希望它有所帮助。
答案 1 :(得分:1)
同时我发现了一些给我一个进度条的宝石,我会在这里列出:
我尝试了来自pgericson的那个和来自jfelchner的那个,它们都有利有弊,但也符合我的需要。可能我将来会分叉并扩展其中一个。
我希望这个可以帮助其他人找到更快,我搜索了几个月。
答案 2 :(得分:0)
也许将您的输出替换为:
print "Progress #{progress_var}%\r"