本地用户和组输出到文件

时间:2015-05-12 19:07:15

标签: file powershell

我有一个脚本,显示所有本地用户及其关联的组。但是,我正在尝试将结果输出到文本文件中,这就是脚本出错的地方,因为它没有给出我从输出窗口收到的相同结果。例如,我的代码是:

$LogFile = Test-Path C:\Users\FredAslami\Downloads\Test.txt
$LocalUsers = [ADSI]"WinNT://$env:COMPUTERNAME"

if ($LogFile) {
  $LocalUsers.Children | where {$_.SchemaClassName -eq 'user'} | Foreach-Object {
    $groups = $_.Groups() | Foreach-Object {
      $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)
    }
    $_ | Select-Object @{n='UserName';e={$_.Name}},
                       @{n='Groups';e={$groups -join ';'}}
  }

  Write-Host "Got User Groups Info"

  Out-File -FilePath C:\Users\FredAslami\Downloads\Test.txt `
    -InputObject $LocalUsers -Append

  Write-Host "Added info to text"
}

$LocalUsers.Dispose()

当我运行时,文件中的文字将为

distinguishedName : 
Path              : WinNT://R68-CUSTOM-01

我也尝试使用Add-Content,但这也不起作用。它会添加如下内容:

System.DirectoryServices.DirectoryEntry

我也尝试在检索本地用户和组信息之后使用Write-Host进行调试,并在将结果写入文本文件之后尝试使用另一个Write-Host进行调试,并注意到它在收集之前将结果写入所有信息。所以我尝试使用Start-Sleep,这似乎没有用。

2 个答案:

答案 0 :(得分:1)

在第二行,您有Select-Object。您从未为其分配过不同的值,因此您将其视为输出。

我建议您将Export-Csv声明用于 //I am working on this assignment objToSendServer.input1 = obj.input1 //type definitions are: class obj { input1: number; } class objToSendServer{ input1: number } // if I do this assignment that value of obj.input1 is "1" // which cause of problem on server side // which is web api odata, patch method that expects type of int objToSendServer.input1 = obj.input1; // if I try cast as below, error message is: //Argument of type 'number' is not assingable of parameter of type 'string' objToSendServer.input1 = parseFloat(obj.input1); //My work around is: objToSendServer.input1 = parseFloat(obj.input1.toString()); 。更简单,更清洁。

答案 1 :(得分:0)

您在屏幕和文件输出中会得到不同的结果,因为您对数据做了不同的事情。以$localUsers.Children开头的管道构建用户对象及其组成员资格的列表,并将其回显到屏幕,但您不会对该数据执行任何其他操作。相反,您将未修改的变量$localUsers写入输出文件。

如果您希望表格数据同时输入控制台和文件,我建议使用Write-Host作为控制台输出,Export-Csv作为文件输出:

$LocalUsers.Children | where {$_.SchemaClassName -eq 'user'} | Foreach-Object {
  $groups = $_.Groups() | Foreach-Object {
    $_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)
  }
  $o = New-Object -Type PSObject -Property @{
         'UserName' = $_.Name
         'Groups'   = $groups -join ';'
       }
  Write-Host $o
  $o
} | Export-Csv 'C:\Users\FredAslami\Downloads\Test.txt' -NoType

如果您希望输出转到成功输出流而不是控制台,您可以在变量中捕获结果并以两种不同的方式输出:

$users = $LocalUsers.Children | where {
           $_.SchemaClassName -eq 'user'
         } | Foreach-Object {
           $groups = $_.Groups() | Foreach-Object {
             $_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)
           }
           New-Object -Type PSObject -Property @{
             'UserName' = $_.Name
             'Groups'   = $groups -join ';'
           }
         }

$users
$users | Export-Csv 'C:\Users\FredAslami\Downloads\Test.txt' -NoType