PowerShell重定向

上代码

if (36 > 42) 
{ 
  "true" 
} 
else 
{ 
  "false"
}

上面这段PowerShell脚本输出什么?没错,是"false"

再上代码

if (36 < 42) 
{ 
  "true" 
} 
else 
{ 
  "false"
}

上面这段PowerShell脚本输出什么?没错!你猜错了。会运行错误。

ParserError:
Line |
   1 |  if (36 < 42) { "true" } else { "false" }
     |         ~
     | The '<' operator is reserved for future use.

为什么?

why

解析

  1. ">" 符号再PowerShell中,是重定向符。
  2. PowerShell中,用于比较的大于,等于,小于之类的,使用-gt、-lt、-eq表达。(这里是全部比较操作)
  3. 第一段脚本之所以按照预期输出"false",是因为执行的过程是这样的
1. 36 > 42,是将“36”写入一个叫做42的文件内(你可以在执行目录下看下,会发现生成一个名称是42的文件,内容是36)
2. 这个写入操作执行后无返回值,所以if($null)就是if(false),自然执行else内容,返回结果“result”

有时候代码确实正确运行了,但可能不是按照我们理解的方式去执行的 😃

重定向是什么?

说这个就要先说PowerShell的输出流,PowerShell有好多种流(看这里

  1. Success stream
  2. Error stream
  3. Warning stream
  4. Verbose stream
  5. Debug stream
  6. Information stream
  7. Progress stream

默认情况下,这些流都会输出到Host,但是你可以向引流水一样把它们输出到文件,用于日志记录。
我们上面提到的">"就是用于该操作,等同于"out-file"命令,我们一般会这么写:

.\script.ps1 > script.log

默认的会把Success流写入文件中。这种写法相当于:

.\script.ps1 1> script.log

1是个啥?1就是Success流,上面我列出来的几种流,你以为前面的数字没用,相当于流的标识。
聪明的你肯定明白了,那我如果要把Error流写入文件,就 2> script.log,对的!
大聪明的读者更明白了,那我如果要把所有流写入文件,就 *> script.log,对的!
卧龙读者就提出问题了,那我如果只想写入Success流和Error流,怎么写?可以先把Erorr流重定向到Success流,然后写入文件。 .\script.ps1 2>&1 > script.log
OS:这可读性...都特么魔鬼数字...

如果想追加到文件中,使用">>"

.\script.ps1 >> script.log

参考

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_redirection?view=powershell-7.1

posted @ 2021-03-25 14:11  talentzemin  阅读(396)  评论(0)    收藏  举报