我正在尝试提取文件夹中所有文件中以"%%"开头的每一行,然后将这些行复制到单独的文本文件中。目前在PowerShell代码中使用此代码,但我没有得到任何结果。
$files = Get-ChildItem "folder" -Filter *.txt
foreach ($file in $files)
{
if ($_ -like "*%%*")
{
Set-Content "Output.txt"
}
}
我认为mklement0建议使用Select-String
是要走的路。再加上他的回答,你可以将Get-ChildItem
的输出通过管道输送到Select-String
中,这样整个过程就变成了一个Powershell一行。
像这样:
Get-ChildItem "folder" -Filter *.txt | Select-String -Pattern '^%%' | Select -ExpandProperty line | Set-Content "Output.txt"
Select-String
cmdlet 提供了更简单的解决方案(PSv3+ 语法):
(Select-String -Path folder*.txt -Pattern '^%%').Line | Set-Content Output.txt
Select-String
通过其-Path
参数接受文件名/路径模式,因此,在这种简单的情况下,不需要Get-ChildItem
。- 相比之下,如果你的输入文件选择是递归的或使用更复杂的条件,你可以通过管道将
Get-ChildItem
的输出传送到Select-String
,如Dave Sexton的有用答案所示。 - 请注意,根据文档,默认情况下
Select-String
假定输入文件是 UTF-8 编码的,但您可以使用-Encoding
参数进行更改;还要考虑下面讨论的输出编码。
- 相比之下,如果你的输入文件选择是递归的或使用更复杂的条件,你可以通过管道将
Select-String
的-Pattern
参数需要一个正则表达式而不是通配符表达式。^%%
只匹配一行开头(^
)的文字%%
。Select-String
输出[Microsoft.PowerShell.Commands.MatchInfo]
对象,其中包含有关每个匹配项的信息;每个对象的.Line
属性都包含匹配的输入行的全文。Set-Content Output.txt
将所有匹配的行发送到单个输出文件Output.txt
Set-Content
使用系统的旧版Windows代码页(8位单字节编码 - 即使文档错误地声称生成ASCII文件)。
如果要显式控制输出编码,请使用-Encoding
参数;例如,... | Set-Content Output.txt -Encoding Utf8
.- 相比之下,
>
,输出重定向运算符总是创建 UTF-16LE 文件(一种编码 PowerShell 调用Unicode
),默认情况下Out-File
也是如此(可以使用-Encoding
更改)。
另请注意,>
/Out-File
将 PowerShell 的默认格式应用于输入对象以获取要写入输出文件的字符串表示形式,而Set-Content
将输入视为字符串(如有必要,.ToString()
调用输入对象)。 在手头的情况下,由于所有输入对象都已经是字符串,因此没有区别(可能除了字符编码)。
至于你尝试过的:
foreach ($file in $files)
内部$_
引用文件([System.IO.FileInfo]
对象),因此您可以有效地根据输入文件的名称而不是其内容*%%*
评估通配符表达式。除此之外,通配符模式
*%%*
将匹配输入字符串中的任何位置%%
,而不仅仅是在其开始时(您必须改用%%*
)。Set-Content "Output.txt"
调用缺少输入,因为它不是管道的一部分,并且在没有管道输入的情况下,未传递-Value
参数。- 但是,即使您确实提供了输入,输出文件
Output.txt
也会在foreach
循环的每次迭代中作为一个整体重写。
- 但是,即使您确实提供了输入,输出文件
首先你必须使用
获取内容
为了获取文件的内容。然后,您执行字符串匹配,并在此基础上再次将内容设置回文件。使用get-content并在foreach中放置另一个循环来迭代文件中的所有行。
我希望这个逻辑对你有所帮助
ls *.txt | %{
$f = $_
gc $f.fullname | {
if($_.StartWith("%%") -eq 1){
$_ >> Output.txt
}#end if
}#end gc
}#end ls
别名
ls - Get-ChildItem
gc - Get-Content
% - ForEach
$_ - Iterator variable for loop
>> - Redirection construct
# - Comment
http://ss64.com/ps/