Powershell zum Suchen von Werten und Erstellen einer Datei

Powershell zum Suchen von Werten und Erstellen einer Datei

Ich bin neu bei Powershell und hoffe auf Hilfe. Ich suche nach einem Powershell-Befehl, der eine Datei durchsucht, eine Zeichenfolge findet und basierend auf dem gefundenen Zeichenfolgenwert eine Datei erstellt.

Die Datei „abc.txt“ enthält einen Satz mit Wörtern, der wie folgt aussieht:Angemeldet bei app\prog01. Aber manchmal enthält die Datei „abc.txt“ ein anderes Programm und eine andere Nummer, wie z. B. „prog21“ oder „prog58“.

Wenn der Befehl ausgeführt wird, wenn die Datei abc.txtBei app\prog58 angemeldetDarin wird eine Datei mit dem einfachen Namen „prog58“ ohne Erweiterung erstellt.

Antwort1

Sie benötigen das Select-StringCmdlet, das standardmäßig den Aliasnamen hat sls. Mit diesem Cmdlet können Sie einen regulären Ausdruck abgleichen und dann die übereinstimmende Zeichenfolge extrahieren. Der vollständige Befehl lautet ungefähr so:

$(sls 'Logged into app\\prog[0-9]+' 'abc.txt' -all).matches | foreach { $fn=$_.value.split('\\')[1]; [System.IO.File]::Create($fn).close(); $fn }

Grundsätzlich nimmt es für jede Instanz der Zeichenfolge Logged into app\\progX(wobei X für eine oder mehrere Ziffern steht), die es in der Datei findet, das Material rechts davon, \bis es das Ende der Ziffern erreicht, erstellt eine Datei mit diesem Namen, schließt die Datei, ohne etwas in sie zu schreiben, und gibt diesen Namen an die Standardausgabe aus (Sie können den letzten Teil entfernen, wenn Sie möchten).

Antwort2

Ich weiß, dass Sie nach einem PowerShell-Befehl gefragt haben, aber was ich gleich anbiete, reicht möglicherweise aus.

Es funktioniert in einer Standard-Cmd.exe-Shell, was bedeutet, dass Sie es auch in PowerShell ausführen können, und es ist abwärtskompatibel mit älteren Windows-Betriebssystemen:

TYPE abc.txt | FIND "Logged into app\prog58" >NUL && IF NOT DEFINED %ERRORLEVEL% (TYPE NUL >prog58)

Aber vielleicht verstehe ich die Frage auch falsch. Könnten Sie klarstellen, ob das genau das ist, wonach Sie suchen, oder ob Sie eine Datei mit einem Namen erstellen möchten, der progXXauf dem in abc.txt vorhandenen Text basiert?

Nach Klarstellung bearbeiten: Das Folgende ist ebenfalls Cmd.exe-kompatibel und nicht PowerShell-exklusiv. Es kann also zwar nicht als Einzeiler verwendet werden, könnte aber als einfaches Batch-Skript aufgerufen werden:

@ECHO OFF
SETLOCAL && SETLOCAL EnableExtensions EnableDelayedExpansion
FOR /F "tokens=1-2 delims=\" %%A IN ('TYPE abc.txt ^| FINDSTR /C:"Logged into app\prog"') DO (SET FILENAME=%%B)
SET FILENAME=%FILENAME:~0,6%
TYPE NUL >%FILENAME%

Vorbehalt: Dies erfordert progXXgenau 2 Ziffern und progXXXwürde daher nicht funktionieren.

verwandte Informationen