![Как вернуть true/false в команде get-content для каждого имени пользователя внутри C:/Users?](https://rvso.com/image/1672345/%D0%9A%D0%B0%D0%BA%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20true%2Ffalse%20%D0%B2%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B5%20get-content%20%D0%B4%D0%BB%D1%8F%20%D0%BA%D0%B0%D0%B6%D0%B4%D0%BE%D0%B3%D0%BE%20%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8%20C%3A%2FUsers%3F.png)
Мы хотим исключить существование плохого файла конфигурации, который мы обнаружили (и также иметь ручное исправление) из папки appdata каждого пользователя. Файл конфигурации существует только здесь и там, а не у каждого пользователя. Поэтому я пытаюсь собрать воедино скрипт, который будет возвращать true/false, если указанный текст совпадает с get-content в config.xml. Я хочу запустить это для каждого профиля пользователя на каждой машине и вывести результаты в csv.
Пока что я столкнулся с проблемой. Все еще изучаю powershell, так что любая помощь будет оценена по достоинству.
$Users = "C:\Users"
$x = "This is the text I'm looking for"
Foreach ($Username in $Users)
{
$Path = "$Users\$Username\AppData\Local\MyApp\Settings\Config.xml"
$y = Get-Content -Path $Path
If ($y -match $x)
{
"true"
}
else
{
"false"
}
}
Как видите, я еще не добрался до части с CSV, потому что не могу сгенерировать правильный путь для get-content.
Вместо того, чтобы иметь правильный путь, на который я надеялся, поскольку цикл foreach отрабатывал свой путь, он был бы таким:
"C:\Users\Username1\AppData\Local\MyApp\Settings\Config.xml"
"C:\Users\Username2\AppData\Local\MyApp\Settings\Config.xml"
"C:\Users\Username3\AppData\Local\MyApp\Settings\Config.xml"
Вместо этого я получаю следующую ошибку:
Get-Content : Cannot find path 'C:\Users\C:\Users\AppData\Local\MyApp\Settings\Config.xml' because it does not exist.
At C:\Users\mastaxx\Desktop\test.ps1:9 char:6
+ $y = Get-Content -Path $Path
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Users\C:\Use...ings\Config.xml:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
Мое, казалось бы, глупое предположение здесь заключается в том, что $Users будет "C:\Users"
(что, как я полагаю, так и есть, потому что я его определил), а $Username будет "Username1"
(что, очевидно, не так). Вместо этого я вижу, что это также имеет место "C:\Users"
в этом случае, делая конструируемый путь неверным:
C:\Users\C:\Users\AppData\Local\MyApp\Settings\Config.xml
Я ожидал, что цикл foreach будет рассматривать каждую папку внутри $Users
как отдельный объект и станет экземпляром $Username
каждого цикла, что позволит мне вставить его в файл конфигурации $path
следующим образом:
$Users $Username
↓ ↓
C:\Users\Username1\AppData\Local\MyApp\Settings\Config.xml
Я не совсем уверен, что я делаю неправильно, но я знаю, что я определенно делаю что-то глупое. Буду очень признателен, если кто-то с лучшими навыками PS поможет указать на это?
решение1
Мне удалось выяснить, что в уравнении не хватает Get-Childitem.
Это правильный способ сделать это, хотя я уверен, что мой PS нуждается в серьезном улучшении, поскольку мне не удалось получить правильно отформатированный CSV для экспорта, поэтому я выбрал неудобный подход, который заключался в выводе отдельного CSV для каждого экземпляра true, но, по крайней мере, это работает!
$computers = Get-Content -Path "C:\computers.txt"
foreach ($comp in $computers) {
$i = "\\$comp\C$\Users\"
$AppData = "\AppData\Local\MyApp\Settings\Config.xml"
$text = "Text I'm Looking For*"
Get-ChildItem -Path $i
Foreach ($folder in Get-Childitem $i)
{
$ReadConfig = Get-Content -Path "$i$folder$AppData"
If ($ReadConfig -match $text)
{
out-file "c:\results\$comp $folder.csv"
}
else
{
"false"
}
}
}