Powershell Foreach, While 및 기타 루프의 작동 방식

Powershell Foreach, While 및 기타 루프의 작동 방식

프로그래밍 학습의 중요한 첫 번째 단계는 루프로 작업하는 것입니다. 고맙게도 PowerShell은 귀하의 기술과 함께 계속 성장하고 있습니다.





프로그램 창 10 강제 종료

매일 사용하는 기존 명령을 루프 내부에 구성하여 시간과 노력을 절약할 수 있습니다. MakeUseOf에서 더 많은 기사를 읽는 중요한 작업을 수행하는 동안 스크립트는 무거운 작업을 수행합니다!





Powershell ForEach 루프: 고급 데이터 처리의 문

ForEach는 ForEach-Object의 별칭입니다. (별칭은 PowerShell의 명령에 대한 바로 가기일 뿐입니다.) 지금은 PowerShell이 ​​데이터를 처리하는 방식에 대해 이야기할 좋은 시간입니다.





대부분의 최신 프로그래밍 언어와 마찬가지로 PowerShell은 객체 지향 . PowerShell의 모든 것은 객체입니다. 즉, 변수도 확장된 속성과 기능을 가짐 . 이 속성 때문에 검색을 변수로 설정하고 결과 배열로 끝낼 수 있습니다.

$yourVar = Get-ChildItem *
foreach ($file in $yourVar){
Your Steps
}

일부 언어에서는 이 배열을 처리하는 것이 다단계 프로세스입니다. 먼저 길이를 구한 다음 각 단계를 계산합니다.



PowerShell에서는 배열을 단계별로 실행하고 ForEach를 사용하여 각 배열에 대해 작업을 수행합니다. 이렇게 하면 몇 줄의 코드가 절약되므로 더 긴 스크립트가 있는 경우에 유용합니다. 예를 들어 다음은 몇 가지 Powershell ForEach 루프를 사용하는 작은 스크립트입니다. 30일 동안 열지 않은 모든 파일의 ZIP 아카이브를 생성합니다.

ForEach 루프를 사용하여 파일 아카이브 시스템 구축

단계를 세분화해 보겠습니다. 너는 사용한다 Get-ChildItem Documents 폴더의 모든 파일을 가져옵니다. 환경 변수 $env:USERPROFILE 현재 프로필을 사용하여 스크립트를 실행합니다. 이 변수는 하드코딩된 경로보다 이식성이 높습니다. 해당 검색의 결과는 변수에 할당됩니다. $ 내문서 . 그런 다음 각 루프를 단계별로 실행하여 ForEach 루프를 만듭니다. $MyDocs의 $Doc .





$oldDocs = @()
$MyDocs = Get-ChildItem -Path '$($env:USERPROFILE)Documents' -Recurse
foreach ($doc in $MyDocs){
if($doc.LastAccessTime -lt $(Get-Date).addDays(-30)){
$oldDocs += $doc
}
}
$ArchiveFolder = New-Item -Path '$($env:USERPROFILE)Documents$((Get-Date -Format MMddyy).toString())' -ItemType Directory
foreach ($doc in $oldDocs){
Move-Item -Path $doc.FullName -Destination '$($ArchiveFolder.FullName)$($doc.Name)' -Confirm $false
}
$source = $ArchiveFolder.FullName
$destination = '$($env:USERPROFILE)Documents$($ArchiveFolder.Name).zip'
Add-Type -AssemblyName 'system.io.compression.filesystem'
[io.compression.zipfile]::CreateFromDirectory($source, $destination)
if(test-path $destination){
Remove-Item -Path $ArchiveFolder -Recurse -Confirm $false
}

루프 내에서 각 파일이 마지막 액세스 시간 자산이 30일 이상 된 것입니다. 우리는 이것을 날짜 가져오기 cmdlet 및 추가일 음수 30의 함수입니다. 그렇다면 파일을 추가합니다. $myOldDocs 정렬. 파일 정렬이 완료되면 완성된 배열을 가져와 zip 파일을 만듭니다. 이 프로세스는 약간의 .NET 호출을 포함하므로 조금 더 복잡합니다. 잘 이해하지 못하더라도 걱정하지 마십시오. 코드를 훔칠 수 있습니다. 이 TechNet 도움말 문서 .

여기에서 무슨 일이 일어나고 있는지 분석하기 위해: 우리는 30일 이상 지난 오늘 날짜로 명명된 새 디렉토리로 모든 이전 파일을 이동할 것입니다. 해당 폴더가 빌드되면 같은 이름의 ZIP 아카이브를 만들어야 합니다. 아카이브가 성공하고 .ZIP 파일이 있는지 테스트한 다음 새 폴더를 삭제합니다. 한 달에 한 번 실행되도록 예약된 작업으로 설정합니다. 약간의 공간을 절약하고 문서 폴더를 깨끗하게 유지할 수 있습니다.





While 및 Do While: 조건 루프

특정 조건이 충족될 때만 루프를 실행하려면 While 루프를 사용합니다. 카운트 업을 추적하기 위해 변수를 사용하는 경우 먼저 설정하십시오.

i=0
while(i<10){
Your Steps
i+=1
}

문제는 카운터를 사용하지 않는 경우 테스트가 true인 경우에도 코드가 한 번 이상 실행되기를 원할 수 있다는 것입니다. 아래 예제 스크립트의 경우입니다. 따라서 이러한 경우 Do-While 루프를 사용하려고 합니다. 구문이 약간 다릅니다.

do{
Your Steps
}while(Conditional Statement)

이것들을 사용하는 것은 초보 프로그래머에게 그다지 명확하지 않습니다. 일반적인 일상적인 스크립팅을 수행하면 자주 마주치지 않을 수 있습니다. 그들이 특히 편리한 곳은 프로세스의 성공을 테스트하기 위한 임시 타이머를 만드는 것입니다.

Instagram에서 누가 팔로우를 취소했는지 확인하는 방법

원격 시스템을 재부팅하고 15분 이내에 복구되지 않으면 경고하는 빠른 스크립트를 작성할 것입니다. 이 시나리오에서는 자주 재부팅하지 않는 홈 서버 또는 기타 시스템을 가정합니다. 컴퓨터가 일반적으로 더 빨리 작동하는 경우 시간을 자유롭게 조정하십시오.

재부팅 및 확인: Do-While 루프 사용

이 스크립트는 조금 더 간단합니다. 먼저, 당신은 컴퓨터 다시 시작 원격 시스템을 재부팅하는 명령입니다. (여기서 재부팅 명령에 더미 IP를 사용했습니다. 이 IP를 컴퓨터의 DNS/IP로 덮어써야 합니다.) 그런 다음 카운터 변수를 생성합니다. NS 0으로 설정합니다. 다음으로 Start-Sleep이 있는 Do 루프가 300초(5분) 동안 스크립트를 중지합니다. 두 번째 명령은 카운터에 하나를 추가합니다.

Restart-Computer -ComputerName 127.0.0.1
i=0
do{
Start-Sleep -Seconds 300
$i += 1
}while((!(Test-Connection 127.0.0.1 -Quiet)) -or $i -gt 3)
if($i -gt 3){
Write-Ouput 'Remote Machine not responding, please check.'
}
else{
Write-Output 'Reboot Succeeded'
}

그런 다음 While 기준이 있습니다. 오류가 경고를 생성하는지 확인하기 위해 Or 테스트를 사용합니다. 대안은 끝없이 원격 시스템을 기다리는 스크립트 루핑입니다. 기계를 확인하기 위해 우리는 테스트 연결 cmdlet. 간단히 하기 위해 이것은 PowerShell용 Ping입니다. 우리는 매개 변수를 추가합니다 -조용한 패킷의 결과가 아닌 True 또는 False를 반환하도록 강제합니다. Or 문의 두 번째 부분은 카운터가 3보다 큰지 확인합니다.

루프가 완료되면 출력을 생성하려고 합니다. 즉, 카운터를 확인해야 합니다. 이것은 빠른 if/else 문입니다. 3보다 크면 스크립트는 원격 시스템이 응답하지 않는다고 출력합니다. 그렇지 않은 경우 재부팅이 성공했다고 출력합니다.

기타 루프

PowerShell에는 두 가지 다른 종류의 루프가 있습니다. 이전 두 루프와 다소 관련이 있지만 일반적으로 사용되지는 않습니다. For 루프는 While 예제와 유사하게 작동합니다. 평가에서 모든 기준을 설정한 다음 cmdlet을 설정합니다.

for($i = 0;$i -lt 10;$i++){
Your Steps
}

Do When 루프는 Do While 루프와 유사하므로 While 문을 When으로 변경하기만 하면 됩니다. 예제 스크립트에서는 동작까지 동일합니다. 스타일 선택이지만 Do While은 다른 상황에서 더 다양합니다. 따라서 하나만 기억한다면 Do While이 더 유용합니다.

PowerShell에는 이러한 각 루프에 대한 도움말도 있습니다. 추가하여 도움을 받을 수 있습니다. ~에 대한 Get-Help에서 루프 이름 앞에 그런 다음 각 유형에 대한 예 및 기타 팁을 볼 수 있습니다. 막혔을 때 도움이 될 것입니다.

당신과 함께 계속 성장

이 시점에서 강력한 스크립트 작성을 시작할 수 있는 대부분의 기술을 갖추었습니다. 가정용 장비를 자동화하든 직장에서 시간을 절약하든 루프는 스크립트가 더 많은 작업을 수행하도록 도와줍니다. 이러한 루프를 오류 처리와 결합하면 스크립팅이 기본 수준 이상으로 향상됩니다. 이것은 더 고급 언어에 대한 문을 엽니다.

루프를 사용하여 만든 영리한 PowerShell 스크립트는 무엇입니까? 의견에서 우리와 공유하십시오.

공유하다 공유하다 트위터 이메일 디스크 공간을 확보하려면 이러한 Windows 파일 및 폴더를 삭제하십시오.

Windows 컴퓨터에서 디스크 공간을 비워야 합니까? 다음은 디스크 공간을 확보하기 위해 안전하게 삭제할 수 있는 Windows 파일 및 폴더입니다.

다음 읽기
관련 항목
  • 프로그램 작성
  • 파워쉘
  • 스크립팅
저자 소개 마이클 맥코넬(44건의 기사 게재)

Michael은 위기에 처했을 때 Mac을 사용하지 않았지만 Applescript로 코딩할 수 있습니다. 그는 컴퓨터 과학 및 영어 학위를 보유하고 있습니다. 그는 한동안 Mac, iOS 및 비디오 게임에 대해 글을 쓰고 있습니다. 그는 10년 이상 스크립팅 및 가상화를 전문으로 하는 주간 IT 원숭이였습니다.

내 아마존 파이어 스틱이 느린 이유
마이클 맥코넬이 참여한 작품 더보기

뉴스레터 구독

기술 팁, 리뷰, 무료 전자책 및 독점 거래에 대한 뉴스레터에 가입하십시오!

구독하려면 여기를 클릭하세요.