在某些情况下,如果我尝试在Select-Object命令后暂停或休眠,则在命令之前发生暂停/休眠.
例如,用
Get-NetAdapter | Select-Object Name,Status
Pause
Run Code Online (Sandbox Code Playgroud)
要么
Get-NetAdapter | Select-Object Name,Status | Where-Object {$_ -ne $null}
Pause
Run Code Online (Sandbox Code Playgroud)
输出是:
Press Enter to continue...: Name Status ---- ------ Wi-Fi Up Ethernet Disconnected
而与
Get-NetAdapter | Select-Object Name,Status | Format-Table
Pause
Run Code Online (Sandbox Code Playgroud)
输出是:
Name Status ---- ------ Wi-Fi Up Ethernet Disconnected Press Enter to continue...:
这里发生了什么?这是一个错误还是一个功能?
执行两个用分号分隔的 PowerShell 命令时,我得到了意想不到的结果。第二个命令的输出发生变化。如果我以相反的顺序运行它们,则看不到第二个命令输出。
在这里,我只是尝试获取时间戳和用户在 AD 中所属的组列表,作为单行。
如果我运行这一行,我会得到以下输出:
Get-ADPrincipalGroupMembership username | Select-Object name
name
----
Domain Users
CL-Inventory-Group
...
Run Code Online (Sandbox Code Playgroud)
但是,如果我运行以下命令,此行为会发生变化:
get-date; Get-ADPrincipalGroupMembership username | Select-Object name
Wednesday, April 3, 2019 2:31:35 PM
name : Domain Users
name : CL-Inventory-Group
...
Run Code Online (Sandbox Code Playgroud)
更奇怪的是,如果我反向运行,这意味着我在第一个命令之后说 get-date,则在列出组后永远不会显示日期戳。
我是否不正确地分隔命令?
起初我对 PowerShell ScriptBlock 很兴奋,但最近我对它在块内的执行顺序感到困惑。例如:
$test_block = {
write-host "show 1"
ps
write-host "show 2"
Get-Date
}
Run Code Online (Sandbox Code Playgroud)
调用 $test_block.Invoke() 的输出:
show 1
show 2
<result of command 'ps'>
<result of command 'get-date'>
Run Code Online (Sandbox Code Playgroud)
输出内容的命令会先运行吗?
因此,在 Powershell 中,如果您写入输出一些行然后抛出错误,您会期望获得错误发生之前发生的输出。所以如果你执行这个:
Write-Output ("test output 1")
Write-Output ("test output 2")
Write-Output ("test output 3")
Write-Output ("test output 4")
Write-Output ("test output 5")
throw "pretend error"
Run Code Online (Sandbox Code Playgroud)
您将得到预期的结果:
test output 1
test output 2
test output 3
test output 4
test output 5
pretend error
At C:\Powershell\Test.ps1:7 char:1
+ throw "pretend error"
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (pretend error:String) [], RuntimeException
+ FullyQualifiedErrorId : pretend error
Run Code Online (Sandbox Code Playgroud)
但是,如果您在数组中写入输出一堆对象,然后抛出错误,则数组的写入输出(以及之后的任何内容)永远不会出现。所以如果你运行这个:
Write-Output ("test output 1")
Write-Output ("test output 2")
Write-Output ("test output 3")
Write-Output …Run Code Online (Sandbox Code Playgroud) 我正在编写一个脚本,试图输出两个不同的自定义对象;一个接一个地遇到问题,所以为了简化,我把所有的代码都精简到了最低限度:
$beep = new-object -TypeName PSObject
$beep | Add-Member -MemberType NoteProperty -Name "Entry1" -Value "beep1"
$beep | Add-Member -MemberType NoteProperty -Name "Entry2" -Value "beep1"
$beep
$boop = new-object -TypeName PSObject
$boop | Add-Member -MemberType NoteProperty -Name "Entry1" -Value "boop1"
$boop | Add-Member -MemberType NoteProperty -Name "Entry2" -Value "boop1"
$boop
Run Code Online (Sandbox Code Playgroud)
当我运行它时,对象似乎组合在一起。当我做一个 get-member 时,它似乎只显示一个对象。为什么?
在我实际尝试完成的代码中,一个对象是上面的自定义对象,但另一个是 selected.system.int32。当我尝试一个接一个地输出时,只有第一个输出。如果我翻转订单;同样的事情,第一个对象得到输出。我做错了什么/不明白?
@JamesQ - 我想让我感到困惑的是当我这样做时:
$beep = new-object -TypeName PSObject
$beep | Add-Member -MemberType NoteProperty -Name "Entry1" -Value "beep1"
$beep | Add-Member -MemberType NoteProperty -Name "Entry2" -Value "beep1" …Run Code Online (Sandbox Code Playgroud) 出于某种原因,对象在 sleep 命令完成之前不会输出。
[pscustomobject]@{message = 'hi'}; sleep 5
Run Code Online (Sandbox Code Playgroud)
这是另一个例子。在循环完成之前您不会看到输出。
foreach ($i in 1..60) {
if ($i -eq 1) { [pscustomobject]@{message = $i} }
sleep 1
}
Run Code Online (Sandbox Code Playgroud)
我猜你必须输出至少 2 个对象才能看到任何东西?¯\_(?)_/¯ 15 秒后,您会看到两个对象。
foreach ($i in 1..60) {
if ($i -eq 1 -or $i -eq 15) { [pscustomobject]@{message = $i} }
sleep 1
}
Run Code Online (Sandbox Code Playgroud)
或者输出足够的属性(> 4)来隐式调用格式列表而不是格式表。 格式表是问题所在。 这马上就出来了。
[pscustomobject]@{a=1; b=2; c=3; d=4; e=5}; sleep 10
Run Code Online (Sandbox Code Playgroud)
我想知道格式表的参数是否可以像-NoWait.
具有包含列宽的格式文件的已知对象类型不存在此问题。
foreach ($i in 1..60) {
if ($i -eq 1) { get-process powershell } …Run Code Online (Sandbox Code Playgroud) 我有以下愚蠢的 PowerShell 脚本:
$username = 'rny'
$null = mkdir "c:\Users\$username\YYY"
$null = mkdir "c:\Users\$username\YYY\TODO"
$null = mkdir "c:\Users\$username\YYY\TODO\2021-12-22_Foo-bar-baz-etc"
$files = "C:\Users\$username\one-two-three-four.sql.wxyz",
"C:\Users\$username\YYY\TODO\2021-11_29_abcdefghijklmnop.wxyz",
"C:\Users\$username\YYY\TODO\2021-12-22_Foo-bar-baz-etc\another-filename.wxyz"
foreach ($file in $files) {
$null = new-item $file
}
Get-ChildItem . -errorAction silentlyContinue -recurse -filter *.wxyz | select-object fullName
foreach ($file in $files) {
remove-item -literalPath $file
}
rmdir "c:\Users\$username\YYY\TODO\2021-12-22_Foo-bar-baz-etc"
rmdir "c:\Users\$username\YYY\TODO"
rmdir "c:\Users\$username\YYY"
Run Code Online (Sandbox Code Playgroud)
当我执行它时,管道的输出get-childItem ... | select-object被截断:
FullName
--------
C:\Users\rny\one-two-three-four.sql.wxyz
C:\Users\rny\YYY\TODO\2021-11_29_abcdefghijklmnop.wxyz
C:\Users\rny\YYY\TODO\2021-12-22_Foo-bar-baz-etc\an...
Run Code Online (Sandbox Code Playgroud)
特别注意最后一行。此行为已在 SuperUser 的其他地方注意到,可接受的答案是将输出通过管道传输到format-tablewith -autoSize。到目前为止,一切都很好。
$files但是,如果我像这样评论数组分配中的第二个文件 …
我在about_Pipelines 上阅读了有关管道在 PowerShell 中的工作原理的信息,并了解到管道一次传送一个对象。
所以这
Get-Service | Format-Table -Property Name, DependentServices
Run Code Online (Sandbox Code Playgroud)
与此不同
Format-Table -InputObject (Get-Service) -Property Name, DependentServices
Run Code Online (Sandbox Code Playgroud)
所以在这里,按照解释,在第一种情况下,一次Format-Table在一个对象上工作,在第二个例子中,Format-Table工作在一个对象数组上。如果我错了,请纠正我。
如果是这种情况,那么我想知道Sort-Object需要处理数据集合的其他 cmdlet 是如何使用管道字符的。
当我做 :
Get-Service | Sort-Object
Run Code Online (Sandbox Code Playgroud)
Sort-Object如果它一次只处理一个对象,它如何能够排序。因此,假设有 100 个服务对象要传递给Sort-Object。会Sort-Object被调用 100 次(每次调用一个对象)?而且,这将如何产生我在屏幕上看到的排序结果。
powershell ×8
output ×2
formatting ×1
object ×1
pipeline ×1
scriptblock ×1
sleep ×1
sort-object ×1