繁体   English   中英

如果从命令提示符运行,powershell脚本将在“ if”子句中退出

[英]powershell script exits in “if” clause if run from command prompt

我对两个看似相同的脚本之间的差异感到惊讶。

first.ps1:

"A"
if ($true) { "B" } 
"C"

second.ps1:

"A"
if ($true) { "B" 
} 
"C"

现在打开一个CMD窗口,并运行以下脚本:

powershell - < first.ps1
    powershell - < second.ps1

首先生产:

A
B
C

而第二只产生

A

不知道为什么重定向到输入无效,但是,如果您仅将脚本指定为powershell的输入参数,则它似乎可以工作:

C:\fa2>powershell.exe C:\fa2\tc.ps1
Comparison starts
There was a difference
Comparison over

这必须是一个错误。

在使用cmd.exe进行重定向的情况下,如果if和else块分别全部放在一行上,则该函数将正常正常地完成:

$candidate = '.\foo.txt'
$current= '.\bar.txt'

"Comparison starts"
if ($(diff $(get-content $current) $(get-content $candidate)).length -gt 0){"There was a difference"} 
else {"There was not a difference"}
"Comparison over"

但是,如果将任一块划分为多行并采用了该分支,则脚本将中止,并且不会发出警告/输出。

我会在PowerShell反馈网站(connect.microsoft.com)上报告此情况。

编辑:

是的,周杰伦证明了这一点。 根本问题是Powershell不支持'<'运算符。 我整天都在网上搜索一些官方文档,但没有找到。 我只是想起我来检查一些旧笔记,发现在v1中不支持对此内容的引用。 它仅支持“>”。

如果我发现比我的记忆更正式的东西,我会尝试更新。 将原始文本留作补充。


我不认为公认的答案在这里是正确的。

看看Lee Holmes博客: 链接

他是Powershell团队的一名开发人员,并且撰写了Powershell Cookbook,只是为了给他的话一点点信任。

我遇到了一些复杂而古老的Bat脚本,这些脚本依赖于一些时髦的奇特二进制重定向,从而遇到了这种问题。 Powershell将运行Bat文件,但在二进制重定向发生的那一刻,它将停止。 使用[Process]:如博客文章中所述,启动非常有效,并且使我能够像其他任何行为良好的脚本一样解析Bat文件的输出。

在您的情况下,我假定“ diff”是实际的exe而不是函数,并且其输出二进制文件而不是文本。

附带一提,我真的不认为需要像您一样将脚本的输出重定向到Powershell。 似乎适得其反。 您编写了一个powershell脚本,不使用专门提供的参数来处理运行的输入似乎是一种浪费。

我不认为这是一个错误。 尝试在控制台上键入每行,您将看到正在发生的事情。 当您键入并打开方括号而不将其关闭时,PowerShell将进入多行输入模式。 要退出此模式,您需要使用右方括号和后面的空白行。 如果在“ C”之前或之后有空白行,则应该可以使用。

当然,也许这是一个错误,并且与多行输入具有相同的效果。 :)

我无法自己使用此功能,powershell忽略了我发送给它的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM