Câu hỏi Tự động thay thế tệp khi phát hiện thay đổi


Hãy tưởng tượng có một tập tin A:\Example\file.txt

Nếu bất kỳ thay đổi nào được phát hiện trong tệp đó, nó sẽ tự động được thay thế bằng tệp B:\example\file.txtvà không có hộp thoại thay thế tập tin hiển thị, cũng không xuất hiện nhắc nhở UAC mỗi lần, mọi thứ chỉ diễn ra ở chế độ nền. Nếu không có thay đổi được phát hiện, không có gì được thực hiện, kịch bản tiếp tục kiểm tra những thay đổi trong nền, trong khi hy vọng tiêu thụ rất ít tài nguyên hệ thống.

Tôi có thể làm:

Copy-Item "A:\Example\file.txt" "B:\Example\file.txt" -Force

Nhưng điều này không phải là định kỳ hoặc chạy trong nền tất cả các thời gian, và tôi không chắc chắn nếu nó có thể bỏ qua nhắc nhở UAC hoặc hộp thoại thay thế tập tin tự động hay không.


1
2018-03-05 20:33


gốc


Xin lưu ý rằng superuser.com không phải là một dịch vụ viết mã / viết mã miễn phí. Nếu bạn cho chúng tôi biết những gì bạn đã thử cho đến nay (bao gồm các script / mã bạn đang sử dụng) và nơi bạn đang mắc kẹt thì chúng tôi có thể cố gắng giúp đỡ với các vấn đề cụ thể. Bạn cũng nên đọc Làm thế nào để tôi đặt một câu hỏi hay?. - DavidPostill♦
Tốt hơn một chút :) - DavidPostill♦
@MagicallyDelicous Thay thế từng phút không phát hiện ra các thay đổi của tập tin, phải không? Nó chỉ thay thế các tập tin mỗi phút bất kể tập tin đã thực sự thay đổi, mà không phải là những gì tôi muốn. - Buffer Over Read
@MagicallyDelicous Tôi muốn nó được thay thế nếu tập tin nói chung thay đổi. Một cái gì đó giống như một giải pháp dựa trên băm có thể làm việc, nhưng tôi không chắc chắn nếu kiểm tra băm mỗi lần là chuyên sâu trên hệ thống hay không. Lý tưởng nhất là tôi muốn tập lệnh chạy trong nền với tài nguyên tối thiểu. - Buffer Over Read
Đó là một cách thú vị như cách thường để thực hiện việc này là sử dụng trình theo dõi hệ thống tệp. Vì vậy, bạn được gọi lại rằng tệp đã thay đổi và bạn thực hiện hành động, ví dụ: sao chép các tập tin mới hơn, tất nhiên, điều này gây ra cùng một cuộc gọi lại khi bạn ghi đè lên các tập tin bạn đang theo dõi để bạn kết thúc trong một vòng lặp vô hạn. pastebin.com/NmHuigtL - HelpingHand


Các câu trả lời:


Về cơ bản, bạn sẽ cần một tác vụ được lên lịch chạy trong khoảng thời gian ngắn - cứ 5 phút một lần - để phát hiện thay đổi. Một ý tưởng cho rằng bạn có thể băm tệp, lưu trữ giá trị, và sau đó có tác vụ được lập lịch của bạn băm tệp một lần nữa và so sánh giá trị băm với giá trị được lưu trữ. Bạn dường như đã quen thuộc với Powershell. Verion 4.0 trở lên có một lệnh Get-FileHash bạn có thể sử dụng. Từ đó, có kịch bản của bạn sao chép tập tin nếu các hash là khác nhau.

Để trả lời nhận xét, đây là một số mã mẫu. StoredHash.txt là một tệp văn bản chứa hàm băm của tệp được đề cập.

$A = Get-Content "StoredHash.txt"
$B = Get-FileHash  -Algorithm MD5 -Path "A:\Example\file.txt"
If (-Not $A = $B)   
  {
  Copy-Item "A:\Example\file.txt" -Destination "B:\Example\file.txt"
  $B | Out-File "StoredHash.txt"   
  }

Dòng cuối cùng lưu trữ Mới băm để bạn có thể tìm kiếm thay đổi tiếp theo. Tôi đã không kiểm tra mã này, vì vậy nó có thể chứa lỗi. Nhưng nó sẽ là đủ để giúp bạn bắt đầu.


1
2018-03-05 21:01