首页 文章

如何在PowerShell中输出内容

提问于
浏览
177

我正在批处理文件中运行PowerShell脚本 . 该脚本获取一个网页并检查该页面的内容是否为“OK”字符串 .

PowerShell脚本向批处理脚本返回错误级别 .

批处理脚本由_自动化程序ScriptFTP执行 . 如果发生错误,我可以让ScriptFTP通过电子邮件将完整的控制台输出发送给管理员 .

在PowerShell脚本中,如果它不是“OK”,我想从网站输出返回值,因此错误消息包含在控制台输出中,因此也包含在状态邮件中 .

我是PowerShell的新手,不知道要使用哪个输出函数 . 我可以看到三个:

  • 写主机

  • 写输出

  • 写错误

什么是正确的东西用于写入相当于 stdout 的Windows?

7 回答

  • 110

    只需输出一些东西,PowerShell就是一件美丽的东西 - 也是它最大的优势之一 . 例如,常见的Hello,World!应用程序减少到一行:

    "Hello, World!"
    

    它创建一个字符串对象,分配上述值,并作为命令管道上的最后一项,它调用 .toString() 方法并将结果输出到 STDOUT (默认情况下) . 一件美丽的事 .

    其他 Write-* 命令特定于将文本输出到其关联的流,并具有它们的位置 .

  • 2

    我认为在这种情况下你需要Write-Output .

    如果你有一个像这样的脚本

    Write-Output "test1";
    Write-Host "test2";
    "test3";
    

    然后,如果您使用重定向输出调用脚本,如 yourscript.ps1 > out.txt ,您将在"out.txt"屏幕_626256_上获得 test2 .

    请注意,"test3"和写入输出行将始终在文本中添加一个新行,并且PowerShell无法停止此操作(即,使用本机命令在PowerShell中无法使用 echo -n ) . 如果您想要(Bash中有点基本和简单)的功能 echo -n ,请参阅samthebest's answer .

    如果批处理文件运行PowerShell命令,则很可能会捕获Write-Output命令 . 我和系统管理员有过关于应该写入控制台的内容以及不应该写入内容的内容 . 我们现在已经同意,如果脚本成功执行或死亡的唯一信息必须是作者可能需要了解执行(更新了哪些项目,设置了哪些字段等等)写入输出 . 这样,当您向系统管理员提交脚本时,如果一切正常,他可以轻松地在屏幕上看到并查看 . 然后将"someredirectedoutput.txt"发回给开发人员 .

  • 2

    您可以在场景中使用其中任何一个,因为它们会写入默认流(输出和错误) . 如果您将输出传递给另一个命令行开关,则需要使用Write-Output,它最终会在Write-Host中终止 .

    本文介绍了不同的输出选项:PowerShell O is for Output

  • 171

    我认为以下是Echo vs. Write-Host的一个很好的展示 . 注意test()实际上如何返回一个int数组,而不是一个int,因为很容易让人相信 .

    function test {
        Write-Host 123
        echo 456 # AKA 'Write-Output'
        return 789
    }
    
    $x = test
    
    Write-Host "x of type '$($x.GetType().name)' = $x"
    
    Write-Host "`$x[0] = $($x[0])"
    Write-Host "`$x[1] = $($x[1])"
    

    上面的终端输出:

    123
    x of type 'Object[]' = 456 789
    $x[0] = 456
    $x[1] = 789
    
  • 7

    你根本无法让PowerShell省略那些讨厌的新行 . 没有脚本或cmdlet可以执行此操作 .

    当然Write-Host绝对是胡说八道,因为你不能重定向/管道!你只需编写自己的:

    using System;
    
    namespace WriteToStdout
    {
        class Program
        {
            static void Main(string[] args)
            {
                if (args != null)
                {
                    Console.Write(string.Join(" ", args));
                }
            }
        }
    }
    

    例如 .

    PS C:\> writetostdout finally I can write to stdout like echo -n
    finally I can write to stdout like echo -nPS C:\>
    
  • 6
    Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta
    

    洋红色可以是“System.ConsoleColor”枚举值之一 - Black,DarkBlue,DarkGreen,DarkCyan,DarkRed,DarkMagenta,DarkYellow,Gray,DarkGray,Blue,Green,Cyan,Red,Magenta,Yellow,White .

    + $File.FullName 是可选的,并显示如何将变量放入字符串 .

  • -11

    使用PowerShell脚本中的外部程序:

    cmd /c echo "Long string: $LongStr"
    

    在运行单独的进程方面,这是愚蠢且昂贵的,但PowerShell的设计很差 .

相关问题