gpt4 book ai didi

powershell - 让标准输入进入 Powershell 流

转载 作者:行者123 更新时间:2023-12-02 22:13:27 24 4
gpt4 key购买 nike

当在命令行上指定文件名时,以下脚本运行良好。

尾部.bat

@echo off
set "COUNT=%1"
set "COUNT=%COUNT:-=%"
set "FILENAME=%~2"
powershell "Get-Content %FILENAME% -Last %COUNT%"

但是,我需要的是能够将文本通过管道传输到 Get-Content从标准输入。我想编写以下内容来获取分配给项目的最后三个 Subversion 标记。我该怎么做才能获得 Get-Content 的来源成为标准输入?
svn ls svn://ahost/arepo/aproject/tags | call tail.bat -3

注意:我不允许安装任何有用的工具,如 tail从外部。必须使用机器上已有的程序来完成。

更新:

@mklement0 提供了答案。从那开始,我添加了代码以使用默认的 COUNT 值 10(如果未提供)。这符合 UNIX/Linux 方式。
@echo off

SET "COUNT=%~1"
IF "%COUNT:~0,1%" == "-" (
SET "COUNT=%COUNT:~1%"
SHIFT
) ELSE (
SET "COUNT=10"
)
SET "FILENAME=%~1"

if "%FILENAME%" == "" (
powershell -noprofile -command "$Input | Select-Object -Last %COUNT%"
) else (
powershell -noprofile -command "Get-Content \"%FILENAME%\" -Last %COUNT%"
)

EXIT /B

最佳答案

重写 tail.bat如下:

@echo off

set "COUNT=%1"
set "COUNT=%COUNT:-=%"
set "FILENAME=%~2"

if "%FILENAME%"=="" (
powershell -noprofile -command "$Input | Select-Object -Last %COUNT%"
) else (
powershell -noprofile -command "Get-Content \"%FILENAME%\" -Last %COUNT%"
)
这将 制作 PowerShell CLI通过 automatic $input variable 读取标准输入 , 如果没有传递文件名参数,由 this answer 提供.
例子:
C:> (echo one & echo two & echo three) | tail.bat -2
two
three
笔记:
  • 虽然 PowerShell 通常通过管道发送并输出任何类型的对象,但它的 与外界的接口(interface)总是涉及字符串 .
  • 因此,假设 $Input 是一个代表外部标准输入的枚举器,我们可以确定它枚举输入文本行 (作为字符串)一个接一个,所以我们只需要选择感兴趣的行,这就是为什么管道到 Select-Object足够了。
  • 相比之下,在 PowerShell 中按名称读取文件需要 Get-Content (顺便说一句,它还通过管道一一发送输入文件的行,除非您还指定 -Raw );自从 Get-Contenttail内置功能,通过参数 -Tail (及其别名 -Last ),这就是这里所需要的。
  • 警告 : 输入字符解码和输出重新编码 PowerShell与外界对话时涉及:
  • 如果您只处理 ASCII 编码的输入(单字节字符,代码点介于 0 到 127 之间),您不必担心。
  • 否则,请为痛苦的世界做好准备 - 请参阅下文了解详情。


  • 字符解码/重新编码问题:
  • 假设 PowerShell 识别您的输入编码(见下文),输出编码始终是控制台窗口分配的编码;不幸的是,默认情况下,这是 OEM 代码页(例如,美国英语系统上的“DOS”代码页 CP437),在 PS 中反射(reflect)为 [Console]::OutputEncoding .
  • 因此,在正确识别输入的情况下,如果您打印到控制台,看起来一切正常,但如果您将输出捕获到一个文件中,您最终会得到一个 OEM 代码页编码的文件,这可能是不受欢迎的。
  • 如果可行,您可以从根本上设置控制台窗口以使用您选择的代码页(输入和输出编码)(使用 chcp ),但不幸的是,尝试更改脚本中的临时编码不是一个选项。
    请注意,使用 UTF-8 - 代码页 65001 - 仅当您将控制台窗口配置为使用一种 TT (TrueType) 字体时才有效。
  • 如上所述,不幸的是,正确识别的输入编码集仅限于以下内容,基于默认输入编码(这也是 OEM 代码页,在 PS 中反射(reflect)为 [Console]::InputEncoding ;记住:输入将被重新编码输出):
  • ASCII 输入(在输出上重新编码将默认保留此编码)
  • 带有 BOM 的 UTF-16 LE 输入 (这就是 PowerShell 所说的 Unicode ,可能会重新编码为输出可能不同的东西)

  • 您可以通过添加 -Encoding <enc> 对预期的输入编码进行硬编码。到Get-Content调用(默认情况下需要 Windows 默认代码页编码),但是对标准输入执行相同的操作(如 $Input 中所反射(reflect)的那样)将是不平凡的。
  • 例如,使用默认输入编码,如果您明确希望将输入解释为 UTF-8(再次注意,在输出上应用 [Console]::OutputEncoding 编码):powershell -noprofile -command "$Input | % { [text.encoding]::utf8.GetString([Console]::InputEncoding.GetBytes($_)) } | Select-Object -Last %COUNT%"

  • 关于powershell - 让标准输入进入 Powershell 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38667584/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com