powershell 如何在一行中输出多个变量

oknrviil  于 2023-01-17  发布在  Shell
关注(0)|答案(3)|浏览(164)

我正在尝试确定CSV中的用户是否处于活动状态,此外,我还想知道它们是服务帐户、用户帐户还是基于OU的计算机帐户。
一切都很好,直到我尝试输出它...输出在几行上(每个var一行)。
我希望输出在一行(逗号之间,所以我会有一个CSV当我完成)...我已经尝试了二十种不同的方式与四十个不同的结果O_o。
额外的好处:为任何产生错误的名称添加一条消息(即用户不存在...)我正在考虑一个if/else,但还没有能够得到基本的输出行为。
我试过用括号括起来,连接变量,嵌套变量...用棍子打我的电脑...静静地思考我的人生选择...

$Users = Get-Content C:\ActiveUsers.txt

ForEach ($User in $Users){
$properties = Get-ADUser -Identity $User | select SamAccountName,Enabled,DistinguishedName 
if (Select-String -Pattern "UserMgt" -InputObject $properties) { $base = "User" }
if (Select-String -Pattern "ApplSec" -InputObject $properties) { $base = "Service Account" }
if (Select-String -Pattern "WkstnMgt" -InputObject $properties) { $base = "Machine Account" }
write-output $properties.SamAccountName $properties.Enabled $base
#$Output = Write-Output $properties.SamAccountName $properties.Enabled $base 
#$Output #| out-file  C:\UserStatus-OU2.csv -append
}
drnojrws

drnojrws1#

要关注问题的 * 一般 * 标题(请参见底部以了解您的 * 特定 * 案例的最佳解决方案):

    • 给定多个变量,比如$a$b$c,我如何将它们输出为一个 * 单行字符串 ,并带有 * 可配置的分隔符 ,比如,

在以下示例中,假设值'foo''bar''baz'分别为变量$a$b$c的值,可以使用以下(解构)赋值创建这些变量:$a, $b, $c = 'foo', 'bar', 'baz'.

  • 使用**-join运算符**:
PS> $a, $b, $c -join ','
foo,bar,baz

这种方法的优点是可以将任意大小的数组用作LHS。

  • 使用可扩展管柱"...",管柱插值),如您自己的解决方案所示:
PS> "$a,$b,$c"
foo,bar,baz
  • 使用**-f,字符串格式化运算符**:
PS> '{0},{1},{2}' -f $a, $b, $c
foo,bar,baz

至于你所尝试的
Write-Output $properties.SamAccountName $properties.Enabled $base
将多个参数传递给Write-Output,将它们 * 逐个 * 写入管道;如果这些参数是 * 字符串 *,每个字符串在其自己的行 * 上打印 ,如果您将输出发送到Out-File/>Set-Content,这也适用。
也就是说,因为您要为 * CSV文件
创建行,最好创建 * 自定义 * 对象来表示行,并使用Export-Csv将它们序列化到文件中(基于您问题中的代码,而不是您的答案:

Get-Content C:\ActiveUsers.txt | 
  ForEach-Object {
    $properties = Get-ADUser -Identity $_ | Select-Object SamAccountName, Enabled, DistinguishedName 

    # Consider using `elseif` here, unless you really want to evaluate
    # all conditions every time.
    # Also, it's better to check a specific property value rather than
    # searching the string representation of the entire object, e.g.
    #   if ($properties.DistinguishedName -match 'UserMgmt') ...
    if (Select-String -Pattern "UserMgt" -InputObject $properties) { $base = "User" }
    if (Select-String -Pattern "ApplSec" -InputObject $properties) { $base = "Service Account" }
    if (Select-String -Pattern "WkstnMgt" -InputObject $properties) { $base = "Machine Account" }

    # For each user, output a custom object.
    # The custom objects' property names becomes the CSV column headers
    # when Export-Csv processes the outputs.
    [pscustomobject] @{
      SamAccountName = $properties.SamAccountName
      Enabled = $properties.SamAccountName
      Base = $base
    }

  } | Export-Csv -NoTypeInformation C:\UserStatus-OU2.csv

请注意单个管道的使用。

nx7onnlm

nx7onnlm2#

好了,我解决了它,它会更好地作为一个数组,但在这里它是(完整的'错误处理'):

$Users = Get-Content C:\ActiveUsers.txt

ForEach ($User in $Users){
$properties = $null

$properties = Get-ADUser -Identity $User | select 
SamAccountName,Enabled,DistinguishedName 

If($Properties){

if (Select-String -Pattern "UserMgt" -InputObject $properties) { $base = "User" }
if (Select-String -Pattern "ApplSec" -InputObject $properties) { $base = 
"Service Account" }
if (Select-String -Pattern "WkstnMgt" -InputObject $properties) { $base =   
Machine Account" }

$Sammy = $Properties.SamAccountName
$Enabled = $properties.Enabled

"$Sammy, $Enabled, $base" | out-file =  C:\User_Status_OU.csv -Append

}
Else {

$Sammy = "No Record"
$Enabled = "No Record"
$base = "No Record"

"$Sammy, $Enabled, $base" | out-file =  C:\User_Status_OU.csv -Append
}
44u64gxh

44u64gxh3#

我知道这是一个老问题,但它可能会帮助那些正在寻找一个简单解决方案的人。这个语法对我来说要简单得多:

Write-Output "$($var1) $($var2)"

相关问题