有谁知道Windows平台上Pipe Viewer的一个好的替代品吗?

问题描述 投票:0回答:6

如果您不知道 Pipe Viewer 是什么(我直到 5 分钟前才知道),那么 这个博客 很好地通过一些示例对其进行了简要介绍。作为一名 ETL 开发人员,我编写了很多 Perl 脚本,很多时候,我使用的文件需要很长时间才能操作(解压缩、移动等)。因此,除了我在 Windows 环境中工作之外,这个工具会很棒。如果有人知道有一个工具可以为您提供管道中运行的操作的进度,请告诉我,因为这将使我的脚本更加有用。

windows scripting windows-xp
6个回答
3
投票

我终于让它在 Cygwin 环境中工作,尽管这不是原始帖子的答案。

--disable-nls
就可以了。

./configure --disable-nls    
make    
make test    
cp pv /usr/bin

== Kenji (k2) ==


3
投票

Cygwinpv(管道查看器)作为可用的软件包,因为我不知道什么时候......但默认情况下它是未安装

  1. 安装页面下载 Cygwin 安装可执行文件。
  2. 安装cygwin时,您需要在Utils部分中明确搜索并标记安装pv

如果您已经安装了 cygwin,您可以稍后通过重新运行安装可执行文件来添加它。


1
投票

我怀疑win32上是否存在这样的工具,但它应该在cygwin上运行。但话又说回来,你可能不会使用它:)


0
投票

我怀疑您想使用管道查看器来捕获控制台应用程序的输出性能(字节/秒)。

如果你想测量进程的IO读/写性能,我建议使用Process Explorer。您可以找到每个进程的性能。

请参阅 https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer


0
投票

我为 Windows 创建了一个名为“PipeViewer”的新实用程序。
它是开源的,它列出了所有当前的命名管道并向您显示每个命名管道的所有详细信息。

将来我们可能会添加一个监视器来实时检查新的命名管道。


0
投票

许多网站上的许多答案都建议使用 cygwin 中的 pv 包。但

pv.exe
取决于
cygwin1.dll
,您需要与可执行文件一起复制的附加 dll 文件。

我最终自己使用 Go 创建了一个简单的

pv
克隆。

package main

import (
    "fmt"
    "io"
    "os"
    "sync"
    "time"
)

func main() {
    // Create a buffer to read data
    buffer := make([]byte, 32768)
    var totalBytes float64 = 0

    // Channel to signal when to update progress
    progressTicker := time.NewTicker(1500 * time.Millisecond)
    defer progressTicker.Stop()

    var wg sync.WaitGroup
    wg.Add(1)

    // Channel to signal when reading is finished
    done := make(chan struct{})

    // Start a goroutine to handle progress display
    go func() {
        defer wg.Done()

        var MB float64 = 1024 * 1024
        var totalMB float64
        var lastBytes float64
        var speed float64
        var elapsed float64

        startTime := time.Now()

        for {
            select {
            case <-progressTicker.C:
                elapsed = time.Since(startTime).Seconds()
                if elapsed > 0 {
                    speed = (totalBytes - lastBytes) / MB / elapsed
                    totalMB = totalBytes / MB
                    fmt.Fprintf(os.Stderr, "\r%8.1f MB, %6.2f MB/s", totalMB, speed)
                    lastBytes = totalBytes
                    startTime = time.Now()
                }
            case <-done:
                totalMB = totalBytes / MB
                fmt.Fprintf(os.Stderr, "\r%8.1f MB\n", totalMB)
                return
            }
        }
    }()

    // Read from stdin and write to stdout
    for {
        n, err := os.Stdin.Read(buffer)
        if err != nil && err != io.EOF {
            fmt.Fprintf(os.Stderr, "Error reading from stdin: %v\n", err)
            break
        }
        if n == 0 {
            break
        }

        // Write to stdout
        if _, err := os.Stdout.Write(buffer[:n]); err != nil {
            fmt.Fprintf(os.Stderr, "Error writing to stdout: %v\n", err)
            break
        }

        // Update total bytes processed
        totalBytes += float64(n)
    }

    // Signal that reading is done
    done <- struct{}{}
    wg.Wait()
}

它的基本功能与

pv
类似,虽然不如
pv
那么全面,但至少它完成了工作。它从
stdin
读取数据并将其发送到
stdout
,同时将总兆字节和速度写入
stderr

© www.soinside.com 2019 - 2024. All rights reserved.