ForEach-Object $_ 变量未按预期工作

ForEach-Object $_ Variable not working as expected

我正在尝试获取 AD 组中每个用户的真实姓名,我已将其创建为让输出显示组中每个成员的用户 ID,然后尝试执行 net user $_ /domain 在 .txt 文件中的每个用户上它给我错误,就像那里什么都没有。在 "why dont you just use Get-AD*" 的冲击之前,我知道它在那里,但我们不能在这里安装该模块。我需要一些其他人无需安装即可使用的东西。

我已经尝试了几种方法来解决这个问题,下面的代码是脚本中似乎无法正常工作的部分。我有另一种方法,我试过它被注释掉了,但把它留在那里作为另一个可能的起点。

function Return-DropDown {
    $Choice = $DropDown.SelectedItem.ToString()
    if ($Choice)
        {
        net group $Choice /domain > C:\Temp\RawOut.txt

        $UserID = Get-Content 'C:\Temp\RawOut.txt'
        $UserID[($UserID.IndexOf('-------------------------------------------------------------------------------') + 1) .. ($UserID.IndexOf('The command completed successfully.') -1)] > C:\Temp\RawIDs.txt

        Start C:\Temp\RawIDs.txt

        Remove-Item C:\Temp\RawOut.txt

        Get-Content -path C:\Temp\RawIDs.txt | ForEach-Object {net user $_ /domain | findstr "Full Name"} >> C:\Temp$Choice+RealNames.txt
        #$RealNames = Get-Content -path C:\Temp\RawIDs.txt
        #ForEach ($_ in $RealNames) 
        #{
           # net user $_ /domain >> C:\Temp$Choice+1.txt

           # }

        }

}

我得到的是:

net : The syntax of this command is:
At C:\Users\MyID\OneDrive - MyCompany\AD Group DropDown.ps1:34 char:64
+ ... path C:\Temp\RawIDs.txt | ForEach-Object {net user $_ /domain} >> C:\ ...
+                                               ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (The syntax of this command is::String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

NET USER
[username [password | *] [options]] [/DOMAIN]
         username {password | *} /ADD [options] [/DOMAIN]
         username [/DELETE] [/DOMAIN]
         username [/TIMES:{times | ALL}]
         username [/ACTIVE: {YES | NO}]

让我知道有关使此功能正常工作的任何建议。

感谢@LotPings 帮助我找到解决方案。

我发现(通过查看 post LotPings 评论)我得到的输出格式导致错误。我的 txt 文件格式为:

User1               User2               User3
User4               User5               User6
...

它试图将整行 User1 User2 User3 作为变量。这显然是行不通的。使用 -replace-split 为我的变量获取正确的格式,现在可以使用了。

function Return-DropDown {
    $Choice = $DropDown.SelectedItem.ToString()
    if ($Choice)
        {
        net group $Choice /domain > C:\Temp\RawOut.txt

        $UserID = Get-Content 'C:\Temp\RawOut.txt'
        $UserID[($UserID.IndexOf('-------------------------------------------------------------------------------') + 1) .. ($UserID.IndexOf('The command completed successfully.') -1)] > C:\Temp\RawIDs.txt

        #Start C:\Temp\RawIDs.txt

        Remove-Item C:\Temp\RawOut.txt

        $results = Get-Content -path C:\Temp\RawIDs.txt

            foreach($result in $results) { 
                ($result -replace '\s+',',') -split ',' | ? { $_ } >> 'C:\temp\users.txt'
                }

        Get-Content -path C:\Temp\users.txt | ForEach-Object {net user $_ /domain | findstr "Full Name"} >> C:\Temp$Choice.txt

        Remove-Item C:\Temp\users.txt
        Remove-Item C:\Temp\RawIDs.txt
        Start C:\Temp$Choice.txt
        }

}