Wie gebe ich beim Befehl „get-content“ für jeden Benutzernamen in C:/Users „true“/„false“ zurück?

Wie gebe ich beim Befehl „get-content“ für jeden Benutzernamen in C:/Users „true“/„false“ zurück?

Wir möchten die Existenz einer fehlerhaften Konfigurationsdatei, die wir identifiziert haben (und für die wir auch eine manuelle Lösung haben), aus dem Appdata-Ordner jedes Benutzers entfernen. Die Konfigurationsdatei existiert nur hier und da und nicht bei jedem Benutzer. Daher versuche ich, ein Skript zusammenzustellen, das „true“/„false“ zurückgibt, wenn der angegebene Text mit „get-content“ in config.xml übereinstimmt. Ich möchte dies für jedes Benutzerprofil auf jedem Computer ausführen und die Ergebnisse in CSV ausgeben.

Bisher bin ich auf ein Problem gestoßen. Ich lerne immer noch Powershell, daher bin ich für jede Hilfe sehr dankbar.

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

Wie Sie sehen, bin ich noch nicht zum CSV-Teil gekommen, da ich nicht in der Lage bin, den richtigen Pfad zum Generieren für „Get-Content“ abzurufen.

Anstatt den richtigen Pfad zu haben, von dem ich gehofft hatte, dass er beim Durchlaufen der Foreach-Schleife folgendermaßen aussehen würde:

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

Stattdessen erhalte ich die folgende Fehlermeldung:

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

Meine scheinbar dumme Annahme hier ist, dass $Users dies wäre "C:\Users"(was ich glaube, weil ich es definiert habe) und $Username dies wäre "Username1"(was es eindeutig nicht ist). Stattdessen kann ich sehen, dass es auch "C:\Users"in diesem Fall so ist, wodurch der erstellte Pfad dieser falsche ist:

C:\Users\C:\Users\AppData\Local\MyApp\Settings\Config.xml

$UsersIch hatte erwartet, dass die foreach-Schleife jeden Ordner darin als einzelnes Objekt behandelt und zur Instanz in jeder Schleife wird, sodass ich ihn wie folgt $Usernamein die Konfigurationsdatei einfügen kann :$path

$Users   $Username
  ↓          ↓
C:\Users\Username1\AppData\Local\MyApp\Settings\Config.xml

Ich bin mir nicht ganz sicher, was ich falsch mache, aber ich weiß, dass ich hier definitiv etwas Dummes mache. Ich wäre sehr dankbar, wenn mir jemand mit besseren PS-Kenntnissen dabei helfen könnte, mich darauf hinzuweisen.

Antwort1

Ich habe herausgefunden, dass in der Gleichung „Get-Childitem“ fehlte.

Das ist die richtige Vorgehensweise, obwohl ich sicher bin, dass mein PS erheblich verbessert werden muss, da ich keine richtig formatierte CSV-Datei zum Exportieren erhalten konnte. Deshalb habe ich mich für den chaotischen Ansatz entschieden, bei dem für jede Instanz von „true“ eine einzelne CSV-Datei ausgegeben wird. Aber immerhin funktioniert es!

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

verwandte Informationen