Tôi đã có cùng một câu hỏi với bạn, và đã tìm ra một cái gì đó với powershell (cửa sổ tích hợp sẵn kịch bản) bằng cách sử dụng các kỹ thuật từ Blog Scripting Guy tại đây và đây . Kịch bản chạy liên tục như một quá trình nền, mà bạn có thể bắt đầu đăng nhập hệ thống với trình lập lịch tác vụ. Tập lệnh sẽ được thông báo mỗi khi ổ đĩa mới được cắm và sau đó thực hiện một thao tác nào đó (ở đây bạn định cấu hình tập lệnh thay vì tác vụ). Vì về cơ bản nó bị tạm dừng trong khi chờ ổ cắm tiếp theo, bạn không nên thấy nó chiếm nhiều tài nguyên. Tôi đi đây
1) Bắt đầu Powershell ISE, có thể được tìm thấy trong menu bắt đầu của bạn trong Phụ kiện / Windows Powershell. 2) Sao chép dán phần sau vào Powershell:
#Requires -version 2.0
Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier volumeChange
write-host (get-date -format s) " Beginning script..."
do{
$newEvent = Wait-Event -SourceIdentifier volumeChange
$eventType = $newEvent.SourceEventArgs.NewEvent.EventType
$eventTypeName = switch($eventType)
{
1 {"Configuration changed"}
2 {"Device arrival"}
3 {"Device removal"}
4 {"docking"}
}
write-host (get-date -format s) " Event detected = " $eventTypeName
if ($eventType -eq 2)
{
$driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName
$driveLabel = ([wmi]"Win32_LogicalDisk='$driveLetter'").VolumeName
write-host (get-date -format s) " Drive name = " $driveLetter
write-host (get-date -format s) " Drive label = " $driveLabel
# Execute process if drive matches specified condition(s)
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
{
write-host (get-date -format s) " Starting task in 3 seconds..."
start-sleep -seconds 3
start-process "Z:\sync.bat"
}
}
Remove-Event -SourceIdentifier volumeChange
} while (1-eq1) #Loop until next event
Unregister-Event -SourceIdentifier volumeChange
3) Bạn cần sửa đổi tập lệnh ở trên để cho biết tập lệnh cần tìm và ổ đĩa nào cần thực thi. Hai dòng để thay đổi là:
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
Ổ cứng usb của tôi có tên 'Mirror' được đặt là ổ Z :. Bạn chỉ có thể sử dụng if ($driveLabel -eq 'MyDiskLabel')
nếu bạn không quan tâm đến bức thư.
start-process "Z:\sync.bat"
Con đường của bất cứ nhiệm vụ nào bạn muốn làm. Trong ví dụ của tôi, tôi đã tạo một tệp bó trên ổ USB của mình để khởi động 3-4 dòng lệnh sao lưu.
4) Khi bạn hoàn tất, hãy lưu tập lệnh của bạn ở đâu đó (tiện ích mở rộng .ps1
), sau đó đi tạo một tác vụ trong Trình lập lịch tác vụ để tập lệnh của bạn chạy ở chế độ nền. Của tôi trông như thế này:
- Kích hoạt: Khi đăng nhập
- Hành động: Bắt đầu một chương trình
- Chương trình / kịch bản: powershell
- Thêm đối số:
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5) Võngà!
6) Công cụ bổ sung:
Nếu bạn muốn cửa sổ tập lệnh của bạn bị ẩn, hãy sử dụng các đối số sau:
- Thêm đối số:
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
Nếu bạn muốn xuất các thông điệp tập lệnh thành một tệp nhật ký (được ghi đè mỗi khi tập lệnh bắt đầu, tức là lúc đăng nhập), hãy sử dụng hành động tác vụ sau:
- Chương trình / tập lệnh: cmd
- Thêm đối số:
/c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script
log.txt "
Bất cứ khi nào bạn muốn kết thúc tập lệnh ẩn đang chạy, bạn có thể kết thúc quá trình "Powershell" trong Trình quản lý tác vụ.
Nhược điểm duy nhất là không có gì sẽ chạy khi bạn khởi động máy tính với ổ đĩa đã được cắm. (Kịch bản có thể được thay đổi để thực hiện kiểm tra đầu tiên mặc dù ban đầu, nhưng tôi đã có đủ cho ngày hôm nay!)