【问题标题】:Is there replacement for cat on Windows在 Windows 上是否有 cat 的替代品
【发布时间】:2010-09-08 18:47:32
【问题描述】:

我需要在 Windows 上使用 *.bat 脚本连接两个二进制文件。

我怎样才能做到这一点?

【问题讨论】:

  • 您的标题问题和描述问题不完全同步。 type 将是标题问题的最佳答案,而 copy /b 将是描述问题的最佳答案。如果可能,您可能想更改该标题。
  • @Joseph type 只能替换 cat 的部分功能(由于 Windows 上的二进制文件和文本文件之间的区别)。
  • 请注意,cat 不仅仅是连接文件;它执行的另一个功能是将标准输入复制到标准输出(不带参数调用时)。有关如何在 Windows 上实现这一点,请参阅此问题:stackoverflow.com/q/52330841

标签: windows command-line scripting


【解决方案1】:

你可以像这样使用copy /b

copy /b file1+file2 destfile

【讨论】:

  • 对于文件序列,您可以使用通配符,例如“copy /b file* destfile”
  • 让我感到奇怪的是,这不是公认的答案,因为在接受答案的 cmets 中概述了 type 的明显问题......除非这个解决方案有类似的缺点但不够受欢迎人们要注意他们!
  • 谢谢!为我工作。出于某种原因,type 在输出文件中重复了两次内容。
【解决方案2】:

只需对多个源文件和一个目标文件使用 dos copy 命令即可。

copy file1+file2 appendedfile

二进制文件可能需要 /B 选项

【讨论】:

    【解决方案3】:

    Windows type 命令的工作方式与 UNIX cat 类似。

    示例 1:

    type file1 file2 > file3
    

    相当于:

    cat file1 file2 > file3
    

    示例 2:

    type  *.vcf > all_in_one.vcf  
    

    此命令会将所有 vcard 合并为一个。

    【讨论】:

    • 在这种情况下 type 的问题是,当在命令行上输入多个文件时,它会添加不需要的文件头。
    • 在命令行中指定多个文件时,在复制文件内容之前,type 会输出几个空行和文件名。试试看:)
    • 啊,我没有注意到标题转到标准错误。很高兴知道。
    • 请注意,带箭头的类型(如上)不适用于大文件(如 > 2 GB 或 4),至少对于 XP。不过,您可以使用“复制”命令(请参阅其他答案)。
    • 另一个提示:避免显示任何其他输出type file1 file2 > file3 2>NUL
    【解决方案4】:

    无耻的 PowerShell 插件(因为我认为学习曲线很痛苦,所以在任何机会教一些东西都会有所帮助)

    Get-Content file1,file2
    

    注意type是Get-Content的别名,所以如果你更喜欢它,你可以写:

    type file1,file2
    

    【讨论】:

    • 它可以工作,但是速度很慢。我在等待 powershell 连接一些大型视频文件时发现了这个问题,每个文件需要半小时。我终止了该进程并使用 cmd 使用type file1 file2 > dest 进行了尝试,每一个都在几秒钟内完成。
    • 它出于某种原因将我的文件转换为 UTF-16。 -Encoding UTF8 没有改变任何东西。
    【解决方案5】:

    如果您可以控制您正在工作的机器,我强烈建议您安装GnuWin32。只需“全部下载”并让 wget 程序检索所有包。然后,您将可以访问 cat、grep、find、gzip、tar、less 和数百种其他工具。

    GnuWin32 是我在新的 Windows 机器上安装的第一批东西之一。

    【讨论】:

    • 我会推荐GetGnuWin32(以简化安装)
    • 如果可以接受使用外部实用程序,我更喜欢适用于 Windows 的 busybox,它是一个包含约 30 个 Unix 实用程序的约 600 kB exe。唯一的区别是应该使用“busybox cat”命令而不是简单的“cat”
    【解决方案6】:

    如果您只是想将文本附加到现有文件的末尾,您可以使用 >> 管道。例如:

    echo new text >>existingFile.txt
    

    【讨论】:

      【解决方案7】:

      如果您必须使用批处理脚本并在此处安装了 python,则这里是 polygot 批处理和 python 答案:

      1>2# : ^
      '''
      @echo off
      python "%~nx0" " %~nx1" "%~nx2" "%~nx3"
      exit /b
      rem ^
      '''
      import sys
      import os
      
      sys.argv = [argv.strip() for argv in sys.argv]
      if len(sys.argv) != 4:
          sys.exit(1)
      
      _, file_one, file_two, out_file = sys.argv
      
      for file_name in [file_one, file_two]:
          if not os.path.isfile(file_name):
              print "Can't find: {0}".format(file_name)
              sys.exit(1)
      
      if os.path.isfile(out_file):
          print "Output file exists and will be overwritten"
      
      with open(out_file, "wb") as out:
          with open(file_one, "rb") as f1:
              out.write(f1.read())
      
          with open(file_two, "rb") as f2:
              out.write(f2.read())
      

      如果另存为 join.bat 用法将是:

      join.bat file_one.bin file_two.bin out_file.bin
      

      也感谢this answer 的启发。

      【讨论】:

        【解决方案8】:

        在 Windows 10 的 Redstone 1 版本中,Windows 为 NTOS 内核添加了一个真正的 Linux 子系统。我认为最初它是为了支持 Android 应用程序,也许是 docker 类型的场景。 Microsoft 与 Canonical 合作并添加了一个实际的本机 bash shell。此外,您可以使用 apt 包管理器来获取许多 Ubuntu 包。例如,您可以像在 Linux 机器上一样执行 apt-get gcc 来安装 GCC 工具链。

        如果我在大学时就存在这样的事情,我想我可以在本地 Windows bash shell 中完成我的大部分 Unix 编程任务。

        【讨论】:

          【解决方案9】:

          我尝试重新加入已在 Linux 服务器中拆分的 tar 存档。

          我发现如果我在Windows的cmd.exe中使用type,会导致文件以错误的顺序加入。(即type有时会先放XXXX.ad,然后放XXXX.ac,XXXX。 aa等...)

          所以,我在 GitHub https://github.com/sharkdp/bat 中找到了一个名为 bat 的工具,它具有 Windows 构建,并且具有更好的代码突出显示,重要的是,它可以在 Windows 上正常工作以重新加入 tar 存档!

          【讨论】:

            【解决方案10】:

            所以我一直在寻找具有保留 EOL 字符的能力的类似解决方案,但发现没有办法,所以我做了我最擅长的事情并制作了自己的实用程序 这是 Windows 的原生 cat 可执行文件 - https://mega.nz/#!6AVgwQhL!qJ1sxx-tLtpBkPIUx__iQDGKAIfmb21GHLFerhNoaWk

            Usage: cat file1 file2 file3 file4 -o output.txt
            -o | Specifies the next arg is the output, we must use this rather than ">>" to preserve the line endings
            

            我称它为sharp-cat,因为它是用C#构建的,请随意使用防病毒软件进行扫描,源代码将根据要求提供

            【讨论】:

              【解决方案11】:

              Windows 类型命令存在问题,例如 Unicode 字符位于 512 字节边界。试试 Cygwin 的猫。

              【讨论】:

                猜你喜欢
                • 2023-03-17
                • 2015-11-13
                • 1970-01-01
                • 2017-03-25
                • 2011-07-23
                • 1970-01-01
                • 1970-01-01
                • 2015-01-27
                • 1970-01-01
                相关资源
                最近更新 更多