Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 选择对象以错误的方式影响未来的默认流_Powershell_Select Object - Fatal编程技术网

Powershell 选择对象以错误的方式影响未来的默认流

Powershell 选择对象以错误的方式影响未来的默认流,powershell,select-object,Powershell,Select Object,Powershell似乎将select cmdlet绑定到默认输出流,并且在命令完成后不会释放它,从而以意外的方式影响将来的命令。它的执行方式并不一致,这使得在编写脚本时,如果不显式地指导输出,就无法生成可预测的输出 如果将命令放在单独的行上,混合使用不同的对象生成cmdlet等,则会发生这种奇怪的情况。如果以交互方式在单独的行上运行命令,则不会发生这种情况,在命令行上自动创建的对象也不会发生这种情况,除非混合使用在命令行上未自动创建的对象 我给出了命令行交互示例,但如果您将这些命令放入脚本中,

Powershell似乎将select cmdlet绑定到默认输出流,并且在命令完成后不会释放它,从而以意外的方式影响将来的命令。它的执行方式并不一致,这使得在编写脚本时,如果不显式地指导输出,就无法生成可预测的输出

如果将命令放在单独的行上,混合使用不同的对象生成cmdlet等,则会发生这种奇怪的情况。如果以交互方式在单独的行上运行命令,则不会发生这种情况,在命令行上自动创建的对象也不会发生这种情况,除非混合使用在命令行上未自动创建的对象

我给出了命令行交互示例,但如果您将这些命令放入脚本中,并且每个命令都位于sperate行上,然后运行脚本,就会发生这种情况

PS/home/dennis>get date |选择dayofweek;约会
星期五
---------
星期一
星期一
PS/home/dennis>“string1”|选择长度;“string2”
长度
------
7.
string2
为了好玩,看看这张:

S/home/dennis>“string0”;“string1”|选择长度;得到主人;“第2条”;获取日期;567 ; 接待
string0
长度
------
7.
1.
string2
1.
567
1.
PS/home/dennis>cat test.ps1
“字符串0”
“string1”|选择长度
接待
“string2”
约会
567
(1..5)
接待
PS/home/dennis>/test.ps1
string0
长度
------
7.
1.
string2
1.
567
1.
2.
3.
4.
5.
1.
...
这也会影响不属于同一类型的对象,事实上,它会影响那些在select语句中甚至没有属性的对象。延迟不是一个选项,明确地强制输出而不使用out host或write host将直接写入powershell输出设备,从而无法创建用于在管道中生成对象的脚本。它也会弄乱变量。注意:

PS/home/dennis>$d=get date |选择dayofweek$e=获取日期$d$E
星期五
---------
星期一
星期一
私人秘书/家庭/丹尼斯>$d
星期五
---------
星期一
PS/home/dennis>$e
2019年8月5日星期一下午12:33:47
对于那些正在思考的人来说,这只是一个显示问题,可以编写脚本来正确地显示它,我再说一次,这使得脚本不再是可以在其他脚本中重用的工具。 观察脚本中的管道如何影响独立交互shell中的命令

PS/home/dennis>cat test.ps1
“字符串0”
“string1”|选择长度
接待
“string2”
约会
567
接待
PS/home/dennis>/test.ps1 |%{$}
string0
长度
------
7.
1.
string2
1.
567
1.
PS/home/dennis>/test.ps1 |%{write host$}
string0
@{Length=7}
System.Management.Automation.Internal.Host.InternalHost
string2
8/5/19 12:50:54下午
567
System.Management.Automation.Internal.Host.InternalHost
PS/home/dennis>/test.ps1 |%{$| out host}
string0
长度
------
7.
姓名:ConsoleHost
版本:6.2.2
实例ID:4e46c643-1a9d-4c55-9151-b311f287a9cb
UI:System.Management.Automation.Internal.Host.InternalHostUserInterface
当前文化:美国
当前文化:美国
PrivateData:Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled:True
伊斯兰堡:错
运行空间:System.Management.Automation.Runspaces.LocalRunspace
string2
2019年8月5日星期一下午1:20:24
567
姓名:ConsoleHost
版本:6.2.2
实例ID:4e46c643-1a9d-4c55-9151-b311f287a9cb
UI:System.Management.Automation.Internal.Host.InternalHostUserInterface
当前文化:美国
当前文化:美国
PrivateData:Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled:True
伊斯兰堡:错
运行空间:System.Management.Automation.Runspaces.LocalRunspace
在任何shell脚本中,我都希望命令独立于前一个命令执行。
这种行为背后的逻辑是什么?避免这种不可预测性的官方建议是什么?

我知道这令人困惑。每当select对象似乎输出一个表时,format table实际上是在后台运行的。这些格式化命令是一种错觉,由格式化文件控制。但物体下面还是一样的

$a=[pscustomobject]@{name='Joe'}
$b=[pscustomobject]@{address='here'}
$a$b |格式表
名称
----
乔
$a$b |格式列表
姓名:乔
地址:这里
其他变通办法:

$(get-date|select dayofweek ; get-date) | format-list
$("string1"|select length ; "string2") | format-list
$("string0" ;"string1"|select length ; get-host ;"string2" ;get-date; 567 ; get-host) | format-list
test.ps1 | format-list
$d示例的问题是,对$d的赋值只是第一个分号之前的第一条语句。这是另一个问题

$d = $(get-date | select dayofweek ; $e = get-date ; $d ; $e)
$d | format-list  # 3 objects, unless you repeat the last line
这样的示例很有效,因为这两个命令都输出具有.format.ps1xml文件的对象类型。使用“选择对象”后,输出为通用PSCustomObject。实际上,您可以尝试在任何脚本中将get date放在第一位

get-date;get-host
从运行中的Windows Powershell:

Out-Default uses steppable pipelines to run the formatter 
cmdlets [like format-table] to do its rendering and then 
calls Out-Host to display the formatted output.

您遇到了
直接与间接
主机输出故障。PoSh将所有间接输出延迟约300ms,以查看是否有与该组类似的内容。这意味着,当显示系统检查是否有更多的“相同类型的对象”相互分组时,所有
写入输出
将其放入输出流
的项目都将延迟。//另一方面,直接输出现在就进入了屏幕。因此,和
*-主机
内容将立即显示-即使是在其他“分组”输出中在下一篇评论中继续…解决方案是不要混合使用这两种类型,或者强制使用
| Out Host
立即输出,或者将间接输出构建到一个对象中,然后立即输出。或者延迟您的间接输出long enuf以等待延迟。//最后两个是不推荐的。。。[咧嘴笑]除了它对dissi这样做