Cách hoạt động của Powershell Foreach, While và Other Loops

Cách hoạt động của Powershell Foreach, While và Other Loops

Bước đầu tiên quan trọng trong việc học lập trình là làm việc với các vòng lặp. Rất may, PowerShell tiếp tục phát triển với các kỹ năng của bạn.





cách đồng bộ xbox một bộ điều khiển

Bạn có thể đóng khung các lệnh hiện có mà bạn sử dụng hàng ngày bên trong các vòng lặp để tiết kiệm thời gian và công sức. Các tập lệnh của bạn thực hiện công việc nặng nhọc trong khi bạn thực hiện công việc quan trọng là đọc thêm các bài viết trên MakeUseOf!





Powershell ForEach Loops: Cánh cửa để xử lý dữ liệu nâng cao

ForEach là bí danh của ForEach-Object. (Bí danh chỉ là một phím tắt cho một lệnh trong PowerShell.) Đây là thời điểm tốt để nói về cách PowerShell xử lý dữ liệu.





Giống như hầu hết các ngôn ngữ lập trình hiện đại, PowerShell là hướng đối tượng. Mọi thứ trong PowerShell là một đối tượng, có nghĩa là ngay cả các biến có các thuộc tính và chức năng mở rộng . Thuộc tính đó là lý do tại sao bạn có thể đặt các tìm kiếm của mình thành một biến và kết thúc bằng một mảng kết quả.

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

Trong một số ngôn ngữ, xử lý mảng này sẽ là một quá trình nhiều bước. Đầu tiên, tính chiều dài và sau đó đếm lên từng bước.



Trong PowerShell, bạn bước qua mảng và thực hiện hành động trên từng mảng bằng ForEach. Điều này giúp bạn tiết kiệm một vài dòng mã, điều này rất hữu ích nếu bạn có một tập lệnh dài hơn. Ví dụ, sau đây là một tập lệnh nhỏ sẽ sử dụng một vài vòng lặp Powershell ForEach. Nó tạo ra một kho lưu trữ ZIP của tất cả các tệp của bạn mà bạn chưa mở trong 30 ngày.

Xây dựng hệ thống lưu trữ tệp bằng ForEach Loops

Hãy chia nhỏ các bước. Bạn dùng Get-ChildItem để lấy tất cả các tệp trong thư mục Documents. Biến môi trường $ env: USERPROFILE chạy tập lệnh bằng cách sử dụng cấu hình hiện tại. Biến này linh hoạt hơn một đường dẫn được mã hóa cứng. Kết quả của tìm kiếm đó được gán cho biến $ MyDocs . Sau đó, chúng tôi tạo vòng lặp ForEach của mình bằng cách thực hiện từng bước $ Doc trong $ MyDocs .





$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
}

Trong vòng lặp, chúng tôi kiểm tra xem mỗi tệp có LastAccessTime tài sản cũ hơn 30 ngày. Chúng tôi nhận được điều này với Hẹn gặp cmdlet và sử dụng AddDays hàm với ba mươi âm. Nếu có, chúng tôi thêm tệp vào $ myOldDocs mảng. Sau khi sắp xếp tệp hoàn tất, chúng tôi lấy mảng đã hoàn thành và tạo tệp zip. Quá trình này phức tạp hơn một chút vì nó liên quan đến việc gọi một chút .NET. Đừng lo lắng nếu bạn không nắm chắc nó - bạn có thể lấy cắp mã từ tài liệu trợ giúp TechNet này .

Để phân tích những gì đang xảy ra ở đây: Chúng tôi sẽ di chuyển tất cả các tệp cũ của chúng tôi sang một thư mục mới có tên cho ngày hôm nay trong hơn 30 ngày. Khi thư mục đó được tạo, chúng ta phải tạo tệp nén ZIP có cùng tên. Chúng tôi sẽ kiểm tra để đảm bảo rằng lưu trữ thành công và tệp .ZIP ở đó, sau đó xóa thư mục mới. Đặt điều này làm nhiệm vụ đã lên lịch để chạy mỗi tháng một lần. Bạn sẽ tiết kiệm cho mình một ít dung lượng và giữ cho thư mục Documents của bạn sạch sẽ.





Trong khi và Làm trong khi: Vòng lặp về điều kiện

Nếu bạn chỉ muốn chạy một vòng lặp khi một điều kiện cụ thể được đáp ứng, bạn sử dụng vòng lặp Trong khi. Nếu bạn đang sử dụng một biến để theo dõi số lượng, hãy đặt biến đó trước.

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

Vấn đề là nếu bạn không sử dụng bộ đếm, bạn có thể muốn mã của mình chạy ít nhất một lần ngay cả khi kiểm tra là đúng. Đây là trường hợp với tập lệnh ví dụ bên dưới. Vì vậy, trong những trường hợp đó, bạn muốn sử dụng vòng lặp Do-While. Cú pháp hơi khác một chút.

do{
Your Steps
}while(Conditional Statement)

Việc sử dụng những thứ này không hoàn toàn rõ ràng đối với một lập trình viên mới vào nghề. Làm kịch bản hàng ngày thông thường, bạn có thể không gặp phải chúng thường xuyên. Điểm đặc biệt hữu ích của chúng là tạo bộ đếm thời gian tạm thời để kiểm tra mức độ thành công của một quy trình.

cách thoát khỏi cửa sổ bật lên nâng cấp windows 10

Chúng tôi sẽ xây dựng một tập lệnh nhanh để khởi động lại máy từ xa và thông báo nếu nó không hoạt động trở lại trong vòng 15 phút. Tình huống này giả định đó là một máy chủ gia đình hoặc máy khác không khởi động lại thường xuyên. Hãy điều chỉnh thời gian nếu máy tính của bạn thường hoạt động nhanh hơn.

Khởi động lại và kiểm tra: Sử dụng vòng lặp Do-While

Tập lệnh này đơn giản hơn một chút. Đầu tiên, bạn sử dụng Khởi động lại-Máy tính lệnh khởi động lại máy từ xa. (Chúng tôi đã sử dụng IP giả ở đây cho các lệnh khởi động lại, hãy nhớ ghi đè IP này bằng DNS / IP của máy tính của bạn). Sau đó, tạo biến bộ đếm, tôi và đặt nó thành 0. Tiếp theo, bạn có vòng lặp Do của mình với Start-Sleep dừng tập lệnh trong 300 giây (năm phút). Lệnh thứ hai thêm một lệnh vào bộ đếm.

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'
}

Sau đó, chúng tôi có tiêu chí Trong khi của chúng tôi. Chúng tôi sử dụng kiểm tra Hoặc để đảm bảo rằng lỗi sẽ tạo ra cảnh báo. Giải pháp thay thế là tập lệnh lặp liên tục chờ máy từ xa. Để kiểm tra máy, chúng tôi đang sử dụng Kiểm tra kết nối cmdlet. Để đơn giản, đây là Ping cho PowerShell. Chúng tôi thêm thông số -Yên lặng buộc nó phải trả về True hoặc False hơn là kết quả của các gói. Phần thứ hai của câu lệnh Or sẽ kiểm tra xem bộ đếm có nhiều hơn ba hay không.

Khi vòng lặp hoàn thành, chúng tôi muốn tạo đầu ra. Điều đó có nghĩa là chúng ta cần phải kiểm tra bộ đếm của mình. Đây là một câu lệnh if / else nhanh chóng. Nếu nó lớn hơn ba, tập lệnh xuất ra rằng máy từ xa không phản hồi. Nếu không, nó sẽ xuất ra thông báo khởi động lại thành công.

Các vòng lặp khác

Có hai loại vòng lặp khác có sẵn trong PowerShell. Chúng có phần liên quan đến hai vòng lặp trước đó, chỉ là chúng không được sử dụng phổ biến. Vòng lặp For hoạt động tương tự như ví dụ While. Bạn đặt tất cả các tiêu chí của mình trong đánh giá, sau đó đặt lệnh ghép ngắn của bạn.

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

Vòng lặp Do Until giống như vòng lặp Do While, bạn chỉ cần thay đổi câu lệnh While thành Until. Trong tập lệnh ví dụ, nó sẽ giống với hành vi. Đó là một sự lựa chọn phong cách, nhưng Do While linh hoạt hơn trong các tình huống khác. Vì vậy, nếu bạn chỉ nhớ một, Do While hữu ích hơn.

PowerShell cũng có trợ giúp cho từng vòng lặp này. Bạn có thể nhận được sự trợ giúp bằng cách thêm Về trước tên vòng lặp trong Get-Help. Sau đó, bạn có thể xem các ví dụ và các mẹo khác cho từng loại. Những điều này sẽ hữu ích nếu bạn gặp khó khăn.

Tiếp tục phát triển cùng bạn

Tại thời điểm này, bạn đã có hầu hết các kỹ năng để bắt đầu xây dựng các kịch bản mạnh mẽ. Cho dù tự động hóa thiết bị gia đình của bạn hay tiết kiệm thời gian tại nơi làm việc, các vòng lặp sẽ giúp các tập lệnh của bạn làm được nhiều việc hơn. Việc kết hợp các vòng lặp này với xử lý lỗi sẽ đưa tập lệnh của bạn vượt ra ngoài những điều cơ bản. Điều này mở ra cánh cửa cho các ngôn ngữ tiên tiến hơn.

Tập lệnh PowerShell thông minh mà bạn đã tạo bằng các vòng lặp là gì? Hãy chia sẻ với chúng tôi trong phần bình luận.

Đăng lại Đăng lại tiếng riu ríu E-mail Xóa các tệp và thư mục Windows này để giải phóng dung lượng đĩa

Cần xóa dung lượng ổ đĩa trên máy tính Windows của bạn? Dưới đây là các tệp và thư mục Windows có thể được xóa một cách an toàn để giải phóng dung lượng ổ đĩa.

Đọc tiếp
Chủ đề liên quan
  • Lập trình
  • PowerShell
  • Viết kịch bản
Giới thiệu về tác giả Michael McConnell(44 bài báo đã xuất bản)

Michael đã không sử dụng máy Mac khi họ đã chết, nhưng anh ấy có thể viết mã trong Applescript. Ông có bằng Khoa học Máy tính và Tiếng Anh; anh ấy đã viết về Mac, iOS và trò chơi điện tử được một lúc rồi; và anh ấy là một con khỉ IT ban ngày trong hơn một thập kỷ, chuyên về viết kịch bản và ảo hóa.

lật video trong windows media player
Xem thêm từ Michael McConnell

Theo dõi bản tin của chúng tôi

Tham gia bản tin của chúng tôi để biết các mẹo công nghệ, đánh giá, sách điện tử miễn phí và các ưu đãi độc quyền!

Bấm vào đây để đăng ký