
私は PowerShell の初心者なので、助けていただきたいです。ファイルを検索して文字列を見つけ、見つかった文字列値に基づいてファイルを作成する PowerShell コマンドを探しています。
ファイル「abc.txt」には次のような文章が含まれています。app\prog01にログインしましたただし、このファイル「abc.txt」には、prog21 や prog58 のように、異なる prog と番号が含まれる場合があります。
コマンドを実行すると、abc.txtにapp\prog58にログインしましたその中に、拡張子のない prog58 という名前の単純なファイルが作成されます。
答え1
Select-String
デフォルトでは というエイリアスが付けられている コマンドレットが必要ですsls
。このコマンドレットを使用すると、正規表現に一致し、一致した文字列を抽出できます。完全なコマンドは次のようになります。
$(sls 'Logged into app\\prog[0-9]+' 'abc.txt' -all).matches | foreach { $fn=$_.value.split('\\')[1]; [System.IO.File]::Create($fn).close(); $fn }
基本的に、ファイル内で見つかった文字列の各インスタンスLogged into app\\progX
(X は 1 つ以上の数字) について、\
数字の末尾に達するまでその右側の内容を取得し、その名前のファイルを作成し、ファイルに書き込まずにファイルを閉じ、その名前を stdout にエコーします (必要に応じて最後の部分を削除できます)。
答え2
PowerShell コマンドを要求されたことは承知していますが、これから提供するコマンドで十分かもしれません。
これは標準の Cmd.exe シェルで動作するため、PowerShell でも実行でき、古い Windows オペレーティング システムとの下位互換性も確保されます。
TYPE abc.txt | FIND "Logged into app\prog58" >NUL && IF NOT DEFINED %ERRORLEVEL% (TYPE NUL >prog58)
ただし、私は質問を誤解している可能性があります。これがまさにあなたが探しているものなのか、それともprogXX
abc.txt に存在するテキストに基づいて という名前でファイルを作成しようとしているのかを明確にしていただけますか?
説明後に編集: 以下も Cmd.exe と互換性があり、PowerShell 専用ではないため、ワンライナーとして使用することはできませんが、単純なバッチ スクリプトとして呼び出すことができます。
@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%
注意: これはprogXX
正確に 2 桁の数字を持つことを前提としているため、progXXX
機能しません。