ForEach-Object $_ Переменная не работает должным образом

Я пытаюсь получить настоящие имена каждого пользователя в группе AD, я создал его до такой степени, чтобы получить вывод, чтобы показать идентификаторы пользователей каждого члена в группе, но затем пытаюсь сделать net user $_ /domainдля каждого пользователя в файле.txt это дает мне ошибки, как будто там ничего нет. Перед натиском "почему бы вам просто не использовать 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}]

Дайте мне знать, как заставить эту функцию работать.

1 ответ

Решение

Спасибо @LotPings за помощь в поиске решения.

Я обнаружил (просматривая сообщение с комментариями LotPings), что получаю вывод в формате, который вызывал ошибку. Мой текстовый файл был отформатирован:

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
        }

}
Другие вопросы по тегам