PowerShell에서 한 줄씩 파일을 읽고 싶습니다. 특히 파일을 반복하고 루프의 변수에 각 행을 저장하고 행에서 일부 처리를 수행하고 싶습니다.
나는 Bash에 해당하는 것을 알고 있습니다.
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
PowerShell 루프에 대한 문서는 많지 않습니다.
PowerShell에서 한 줄씩 파일을 읽고 싶습니다. 특히 파일을 반복하고 루프의 변수에 각 행을 저장하고 행에서 일부 처리를 수행하고 싶습니다.
나는 Bash에 해당하는 것을 알고 있습니다.
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
PowerShell 루프에 대한 문서는 많지 않습니다.
process
블록을 지정하지 않는 함수 로 파이프를 연결하고 파이프 라인에 한 줄에 다른 개체를 뱉어내는 경우 해당 함수가 문제입니다. 전체 콘텐츠를 메모리에로드하는 데 문제가있는 것은의 잘못이 아닙니다 Get-Content
.
foreach($line in Get-Content .\file.txt)
반복을 시작하기 전에 전체 파일을 메모리에로드합니다. 저를 믿지 않으시면 1GB 로그 파일을 받아보십시오.
Get-Content .\file.txt | ForEach-Object -Process {}
파이프 라인을 인식하며 전체 파일을 메모리로로드하지 않습니다. 기본적으로 Get-Content는 파이프 라인을 통해 한 번에 한 줄씩 전달합니다.
답변:
PowerShell 루프에 대한 문서는 많지 않습니다.
PowerShell의 루프에 문서가 풍부하고, 다음 도움말 항목을 체크 아웃 할 수 있습니다 : about_For
, about_ForEach
, about_Do
, about_While
.
foreach($line in Get-Content .\file.txt) {
if($line -match $regex){
# Work here
}
}
문제에 대한 또 다른 관용적 PowerShell 솔루션은 텍스트 파일의 줄을 ForEach-Object
cmdlet 으로 파이프하는 것입니다 .
Get-Content .\file.txt | ForEach-Object {
if($_ -match $regex){
# Work here
}
}
루프 내에서 일치하는 정규식 대신에 Where-Object
관심있는 라인 만 필터링하기 위해 라인을 파이프 할 수 있습니다.
Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
# Work here
}
docs.microsoft.com
.
Get-Content
성능이 좋지 않습니다. 한 번에 파일을 메모리로 읽어들이려고합니다.
C # (. NET) 파일 판독기는 각 줄을 하나씩 읽습니다.
최고의 공연
foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
$line
}
또는 약간 덜 성능
[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
$_
}
이 foreach
진술은 약간 더 빠를 것입니다 ForEach-Object
(자세한 내용은 아래 주석 참조).
[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object { ... }
. 이 foreach
문은 전체 컬렉션을 개체로로드합니다 . ForEach-Object
파이프 라인을 사용하여 스트리밍합니다. 이제 foreach
명령문은 ForEach-Object
명령 보다 약간 더 빠를 수 있지만 일반적으로 전체를 메모리에로드하는 것이 더 빠르기 때문입니다. Get-Content
그러나 여전히 끔찍합니다.
foreach()
는 별칭입니다Foreach-Object
foreach
성명,처럼 if
, for
또는 while
. ForEach-Object
같은 명령 Get-ChildItem
입니다. foreach
for 의 기본 별칭도 ForEach-Object
있지만 파이프 라인이있는 경우에만 사용됩니다. 에서 긴 설명을 Get-Help about_Foreach
보거나 명령문과 명령의 차이점에 대한 Microsoft의 The Scripting Guys의 전체 기사로 이동하는 이전 댓글의 링크를 클릭하십시오.
Get-Alias foreach
=> Foreach-Object
,하지만 당신은 오른쪽 차이가 있습니다
$line
에 $_
루프의 스크립트 블록에서.
Get-Content
전체 파일을 한 번에 메모리로로드하므로 큰 파일에서는 실패하거나 멈 춥니 다.