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
}
}