使用PowerShell循环浏览目录中的文件

使用PowerShell循环浏览目录中的文件,powershell,Powershell,如何更改以下代码以查看目录中的所有.log文件,而不仅仅是一个文件 我需要遍历所有文件并删除所有不包含“step4”或“step9”的行。目前,这将创建一个新文件,但我不确定如何在这里为每个循环使用(新手) 实际文件的名称如下:2013 09 03 00\u 01\u 29.log。我希望输出文件要么覆盖它们,要么具有相同的名称,并附加“out” 要获取目录的内容,可以使用 $files = Get-ChildItem "C:\Users\gerhardl\Documents\My Receiv

如何更改以下代码以查看目录中的所有.log文件,而不仅仅是一个文件

我需要遍历所有文件并删除所有不包含“step4”或“step9”的行。目前,这将创建一个新文件,但我不确定如何在这里为每个循环使用
(新手)

实际文件的名称如下:2013 09 03 00\u 01\u 29.log。我希望输出文件要么覆盖它们,要么具有相同的名称,并附加“out”


要获取目录的内容,可以使用

$files = Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files\"
然后您也可以循环此变量:

for ($i=0; $i -lt $files.Count; $i++) {
    $outfile = $files[$i].FullName + "out" 
    Get-Content $files[$i].FullName | Where-Object { ($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile
}
更简单的方法是
foreach
循环(感谢@Soapy和@markschultheis):

尝试一下:

Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files" -Filter *.log | 
Foreach-Object {
    $content = Get-Content $_.FullName

    #filter and save content to the original file
    $content | Where-Object {$_ -match 'step[49]'} | Set-Content $_.FullName

    #filter and save content to a new file 
    $content | Where-Object {$_ -match 'step[49]'} | Set-Content ($_.BaseName + '_out.log')
}

其他答案都很好,我只想补充一下。。。PowerShell中可用的另一种方法: 安装GNUWin32 utils并使用grep查看行/将输出重定向到文件

每次执行以下操作时,都会覆盖新文件:

grep "step[49]" logIn.log > logOut.log 
这会附加日志输出,以防覆盖登录文件并希望保留数据:

grep "step[49]" logIn.log >> logOut.log 

注意:为了能够全局使用GNUWin32 utils,您必须将bin文件夹添加到您的系统路径。

如果您需要针对特定类型的文件在目录中递归循环,请使用下面的命令,该命令将过滤
doc
文件类型的所有文件

$fileNames=Get ChildItem-Path$scriptPath-Recurse-Include*.doc

如果需要对多个类型执行过滤,请使用以下命令

$fileNames=Get ChildItem-Path$scriptPath-Recurse-Include*.doc,*.pdf


现在,
$fileNames
变量充当一个数组,您可以从中循环并应用业务逻辑。

这将创建一个名为“out.log”的输出文件。如何为每个输入文件创建一个单独的输出文件?@user2725402我添加了一个名为out的依赖于输入的输出文件不确定我做错了什么,但这不起作用-我现在没有输出文件(也没有错误):
$files=get ChildItem“C:\Users\gerhardl\Documents\My Received files\”$files| Where Object{$outFile=$\.Name+“out”Get Content$\.FullName{Where Object{$\-match'step4'-或$\-match'step9'}Set Content$outFile}
您也可以执行
foreach($f in Get ChildItem“C:\Users\gerhardl\Documents\My Received Files\”){…}
或使用
foreach($f in$Files){…}
谢谢。BaseName部分不起作用(版本1)-但是我首先创建了完整文件的备份,然后对原始文件进行了更改。对于v1,您可以使用以下内容提取基本名称:[io.path]::GetFileNameWithoutExtension($name)如果我用
FullName
替换
BaseName
,我会得到我想要的。这个问题被标记为PowerShell,而不是UnixYes。显然,我的观点很简单:你可以在Windows中使用GNUWin32 utils,因此你可以在PowerShell中轻松使用*nix工具。很有效。没有人说过,答案必须完全是PowerShell的本机。而且即使他们这样做了,你仍然可以直接从Powershell调用Win32 UTIL。使用任何可用和兼容的工具实际上并不是一件坏事。我本来会编辑我以前的评论,但我超过了5分钟的限制:SteveC:你是说在Windows下使用工作正常的GNU工具在某种程度上是对Powershell的蔑视吗?这就是有一件事。我知道在Powershell中解决这个问题在短期内可能会更有成效。从长期来看,扩展可能性实际上更有价值。您添加了更多选项,并且完全在Windows和Powershell中工作,没有像Cygwin这样的Linux模拟器。因此,尽管我理解您的保留意见,但我不同意。问题n是关于在PowerShell中查找,而不是可以使用的大量其他语言。答案是针对这个问题的。这个问题很明确,因为它希望在PowerShell中找到答案。你的答案是安装并使用它。你可以建议安装Ruby等。我的问题是忽略了隐藏和/或系统f要查看这些文件,您必须使用
-Force
参数获取ChildItem。请参阅其文档。
grep "step[49]" logIn.log > logOut.log 
grep "step[49]" logIn.log >> logOut.log