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
}
}
我正在尝试获取 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
}
}