私のオペレーティング システムは Windows 10 です。
1 つまたは複数の .txt ファイルを含むフォルダーがあります。各ファイルには、次のようにフォーマットされた行があります。
2016-12-07 14:08:43 7.7 b=123 r=890
フォルダー内のすべてのファイルを調べ、6.7
7 日以上前の日付を含むすべてのファイルのファイル名を .txt ファイルに提供する、実行可能な再現可能なプロセスを作成したいと考えています。
シナリオ例:
ファイル1には以下が含まれます:2016-12-07 14:08:43 7.7 b=123 r=890
ファイル2には以下が含まれます:2017-01-24 14:08:43 7.7 b=123 r=890
ファイル3には以下が含まれます:2017-01-23 14:08:43 6.7 b=123 r=890
プロセスを実行すると、次の内容を含む .txt ファイルが受信されます。File3
これをコマンド ラインや PowerShell を使用して実行できるかどうか、またはこのタスクを実行するために完全な開発作業が必要なのかどうかはわかりません。
答え1
次のPowerShellスクリプト
Get-ChildItem *.txt -Recurse |
ForEach-Object {
$aux=$_
Get-Content "$aux" |
ForEach-Object {
if ($_ -match '6\.7') {
if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7)) {
$aux.FullName
}
}
}
}
または同等のワンライナー
Get-ChildItem *.txt -Recurse | ForEach-Object { $aux=$_; Get-Content "$aux" | ForEach-Object {if ($_ -match '6\.7') {if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7)) {$aux.FullName}}}}
基本的な説明:
txt
ファイルのリストを取得しGet-ChildItem
、|
結果を次のコマンドレットにパイプする- (パイプ)特定のファイルごとに
ForEach-Object
- 補助変数に保存します
$aux=$_
(;
ワンライナーの末尾のセミコロンに注意してください) - 内容を1行ずつ取得し
Get-Content
、|
結果を次のコマンドレットにパイプします。 - (パイプ)特定の行ごとに
ForEach-Object
- 行に
6.7
文字列が含まれているかどうかをテストするif ($_ -match '6\.7')
- そうであれば、日付(最初の19文字)が指定された基準に一致するかどうかをテストします。
if ( [datetime] …
- もしそうなら、ファイル名を公開する
$aux.FullName
{
そして、一連の終了 s を使用してすべての開始 s を閉じます}
。
答え2
JosefZ の元の回答を拡張すると、次の回答がより完全であることがわかります。
PowerShell ファイル内に以下を含めます。
$filespath = "\\sampledirectory\log\"
$outputfilename = "\\sampledirectory\log\results.txt"
########## file creation step
Get-ChildItem -Path $filespath *.txt -Recurse |
ForEach-Object {
$aux=$_
Get-Content "$aux" |
ForEach-Object {
if ($_ -match '6\.7')
{
if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7))
{
$aux.FullName | Out-File $outputfilename -append
}
}
}
}