So schließen Sie das Systemverzeichnis mit Powershell aus

1018
gsb005

Ich möchte eine einfache Möglichkeit, den Systemordner von der Suche in PowerShell auszuschließen.

Ich verwende das folgende Skript:

$mysys = 'c:\windows'  PS C:\> Get-ChildItem -path . -Include *.txt -Exclude '$mysys' -Recurse 

Grundsätzlich möchte ich, dass alles unter c: \ windows vollständig ignoriert wird. Wenn ich jedoch die Suche starte, erhalte ich ständig Fehler, wenn unter c: \ windows gesucht wird. und gibt in einigen Fällen auch Ergebnisse heraus, die es gefunden hat.

Fehler: (Warum läuft es auch unter c: \ windows, wenn ich es ausgeschlossen habe)

Get-ChildItem : Access to the path 'C:\Windows\System32\LogFiles\WMI\RtBackup' is denied. At line:1 

char: 1 + Get-ChildItem -Pfad. -Inkludieren Sie * .txt -Exclude '$ mysys' -Recurse -Dept ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Kategorie-Info: PermissionDenied: (C: \ Windows \ Syst ... es \ WMI \ RtBackup: String) [Get-ChildItem], UnauthorizedAccessExcept Ion + FullyQualifiedErrorId: DirUnauthorizedAccessError, Microsoft.PowerShell.Commands

Zum Beispiel enthält es: (dies sollte alles ausgeschlossen werden) (grundsätzlich alles unter c: \ windows)

> > Directory: C:\Windows\WinSxS\amd64_microsoft-windows-c..iser-inboxdatafiles_31bf3856ad364e35_10.0.14393.0_none_9eeac2cef7a25999 >  >  > Mode LastWriteTime Length Name  >  > ---- ------------- ------ ----  > -a---- 7/16/2016 6:42 AM 855814 hwcompat_RS1.txt  > ------ 7/16/2016 6:42 AM 1764 hwexclude_RS1.txt  > ------ 7/16/2016 6:42 AM 1327 wucompat.txt 

Ich möchte grundsätzlich eine rekursive Suche unter c: \ ausführen und dann ausschließen, was ich nicht will. Angefangen mit c: \ windows und alles darunter.

1
Die Option -exclude von Get-ChildItem funktioniert nur für Blätter, nicht für Pfadelemente. Sie müssen zu einem Ort, wo Sie ausschließen können. LotPings vor 7 Jahren 0
Kannst du mir ein Beispiel geben? gsb005 vor 7 Jahren 0
Siehe die [Antwort auf diese Frage] (https://superuser.com/questions/1190355/powershell-get-childitem-include-exclude-simple-script-not-working-properly). LotPings vor 7 Jahren 1
Das war genau das, wonach ich @Lotpings gesucht hatte !! Vielen Dank!! gsb005 vor 7 Jahren 0
Fühlen Sie sich frei, diese Antwort abzustimmen ;-) LotPings vor 7 Jahren 0
Tun, aber wie? (Ich bin neu hier) Ich sehe kein danebenes Voting? :-( gsb005 vor 7 Jahren 0
Sie benötigen noch 4 weitere Vertreter (um abzustimmen) (https://superuser.com/help/privileges/vote-up) LotPings vor 7 Jahren 0

1 Antwort auf die Frage

0
Ƭᴇcʜιᴇ007

Schlagen Sie einige kleinere Syntaxkorrekturen vor (diese Änderungen lösen Ihr Problem nicht, es ist nur eine bessere Syntax):

$mysys = 'c:\windows\*'  Get-ChildItem -path . -Include *.txt -Exclude $mysys -Recurse 

Jedenfalls...

Warum läuft es sogar unter c: \ windows, wenn ich es ausgeschlossen habe

Sie schließen nur Dinge in "C: \ windows" aus den Ergebnissen von Get-ChildItem aus. GCI muss immer noch in den Ordnern nachsehen, von denen Sie den Befehl erhalten haben, zu überprüfen, ob etwas übereinstimmt. Dies verursacht den Fehler "Zugriff verweigert".

Wenn Sie vollständig auf Ordner verzichten möchten, auf die Sie keinen Zugriff haben, müssen Sie eine Liste der Ordner erstellen, die Sie mit GCI abfragen möchten, anstatt nur GCI mitzuteilen, dass alles im aktuellen Pfad überprüft wird.

Die einzige Möglichkeit, dies zu tun, ist im Grunde das gleiche Verfahren: Überprüfen Sie jeden Ordner und führen Sie eine Liste der Ordner, für die Sie keinen Zugriff verweigern, und verwenden Sie diese Liste dann mit GCI. Am Ende versuchen Sie trotzdem immer noch, auf die Ordner zuzugreifen (und den Fehler zu werfen), so dass dies im Prinzip keinen Vorteil bringt (erwarten Sie zusätzliche Komplexität).

Wenn Sie die roten Fehler während der Ausführung des Befehls nicht sehen möchten, können Sie den -ErrorActionParameter verwenden und GCI anweisen, den Fehler im Stillen fortzusetzen. Zum Beispiel:

Get-ChildItem -path . -Include *.txt -Exclude $mysys -Recurse -ErrorAction SilentlyContinue 
Vielen Dank Techie007. Das finde ich erstaunlich. ---- PowerShell kann einen Ordner und alles darunter nicht ausschließen? scheint eine solche Grundvoraussetzung zu sein. gsb005 vor 7 Jahren 0
Leider hat $ mysys = 'c: \ windows \ *' nicht funktioniert, es schaut immer noch darunter. gsb005 vor 7 Jahren 0
`" Leider hat $ mysys = 'c: \ windows \ *' nicht funktioniert. '`Wenn Sie das tun, wird nichts behoben, es ist nur die richtige Syntax für" alles, was mit' c: \ windows \\ beginnt. "". :) Ƭᴇcʜιᴇ007 vor 7 Jahren 0
Techie007, können Sie bitte etwas Licht einbringen, können Sie mir bitte sagen, ob die Verwendung von $ env: SystemRoot, Parameter im obigen Skript positive Ergebnisse bringt? gsb005 vor 7 Jahren 0
Die Umgebungsvariable "$ env: SystemRoot" sollte besser verwendet werden, wenn Sie das Skript (auf verschiedenen Computern) erneut verwenden, da Windows an einem anderen Ort als "c: \ windows" installiert werden kann, weshalb diese Systemvariable verwendet wird existiert. :) Allerdings macht die Verwendung dieser Variablen anstelle von "c: \ windows" im fraglichen Code keinen Unterschied. Ƭᴇcʜιᴇ007 vor 7 Jahren 0
Techie007, ist es für Sie merkwürdig, dass PowerShell, wie Sie es bereits erklärt haben, keine einfache Möglichkeit hat, einen gesamten Ordner und seine Chiildateien auszuschließen? gsb005 vor 7 Jahren 0
Nein, das ist für mich nicht sonderbar, da GCI ein Array von Objekten zurückgibt und keine einfache Textliste. Seltsam für mich ist, dass es für Sie ein Problem ist, Zugriff-verweigerte Fehler zu erhalten. :) Ƭᴇcʜιᴇ007 vor 7 Jahren 0
Hinweis: Die Lösung (en) zu der Frage @LotPings in seinem Kommentar implementieren weiterhin die ContinueSilently-Fehleraktion (aus den gleichen Gründen, die hier erwähnt werden. :)) Ƭᴇcʜιᴇ007 vor 7 Jahren 0
Zugriff verweigert Fehler sind in Ordnung, und ich kann mit denen leben, wie Sie selbst mit einem 'SilientlyContinue' Schalter erklärt haben. gsb005 vor 7 Jahren 0
das Hauptproblem ist; Ich möchte nicht, dass meine "Suche" in den Bereich des Windows-Ordners geht. Ich möchte nichts von diesem Ordner. Daher möchte ich es wie die Pest vermeiden, wenn es in der Zukunft eine DLL gibt, die ich will, nur dann zeige ich meine Energie auf diesen Ordner. Ich möchte nicht, dass meine rekursive Suche c: \ windows und alles darunter umfasst. Zum einen möchte ich später einen "move" -Befehl übermitteln, um einige dieser TXT-Dateien in ein anderes Verzeichnis zu verschieben und "Ändern" oder "Wechseln" im systemroot-Ordner zu vermeiden. gsb005 vor 7 Jahren 0
Die Suche im Windows-Ordner ist also nicht wirklich ein Problem, es geht darum, dass Sie keine Ergebnisse aus dem Windows-Ordner erhalten möchten, selbst wenn Sie in den Ordner aufgenommen werden dürfen, und die Dateien, die Ihren Kriterien entsprechen - richtig sind ? Ƭᴇcʜιᴇ007 vor 7 Jahren 0
Genau, Techie007. BTW, danke für all die bisherigen Tipps. gsb005 vor 7 Jahren 0
Dann würde ich mich mit einem Where-Object befassen, um die Ergebnisse zu filtern, wie in den Q & A vorgeschlagenen Links von @LotPings vorgeschlagen: https://superuser.com/questions/1190355/powershell-get-childitem-include-exclude-simple-script -funktioniert nicht richtig :) Ƭᴇcʜιᴇ007 vor 7 Jahren 0
Ausgezeichnet!! Vielen Dank für das Bleiben und Beantworten aller Fragen, einen guten Tag, mein Herr. gsb005 vor 7 Jahren 0