使用PowerShell循环浏览目录中的文件
如何更改以下代码以查看目录中的所有.log文件,而不仅仅是一个文件 我需要遍历所有文件并删除所有不包含“step4”或“step9”的行。目前,这将创建一个新文件,但我不确定如何在这里为每个循环使用使用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
(新手)
实际文件的名称如下: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