相关疑难解决方法(0)

Select-Object后无法暂停或休眠

在某些情况下,如果我尝试在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

8
推荐指数
2
解决办法
845
查看次数

为什么在一行中运行两个 PowerShell 命令时输出格式会发生变化?

执行两个用分号分隔的 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 formatting

6
推荐指数
1
解决办法
569
查看次数

PowerShell 脚本块内的命令执行顺序

起初我对 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 scriptblock

4
推荐指数
2
解决办法
1785
查看次数

如果随后抛出错误,数组的 Powershell 写入输出将丢失

因此,在 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)

powershell

4
推荐指数
1
解决办法
679
查看次数

Powershell 自定义对象混淆

我正在编写一个脚本,试图输出两个不同的自定义对象;一个接一个地遇到问题,所以为了简化,我把所有的代码都精简到了最低限度:

$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)

powershell

3
推荐指数
1
解决办法
1125
查看次数

对象输出的奇怪延迟后跟开始睡眠(或直到脚本结束)

出于某种原因,对象在 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 sleep object output

3
推荐指数
2
解决办法
375
查看次数

是什么导致 select-object 的输出被截断?

我有以下愚蠢的 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但是,如果我像这样评论数组分配中的第二个文件 …

powershell output

3
推荐指数
2
解决办法
4496
查看次数

Powershell 中的管道

我在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 pipeline sort-object

2
推荐指数
1
解决办法
75
查看次数