Как создать сценарий PowerShell для копирования файла на флэш-накопитель USB?
У меня есть VHD-файл виртуального жесткого диска, который я хотел бы делать ежедневно, нажимая на ярлык на моем ноутбуке с Windows Vista. Я написал файл пакетного сценария с половинной опасностью (BACKUP.BAT), который завершает работу, где он открывает окно cmd и копирует файл на флэш-диск, но я хотел бы имитировать (макрос) способ отображения копирования, когда Вы вручную перетаскиваете файл на флешку в моем компьютере. Другая проблема заключается в том, что в зависимости от того, на каком компьютере это делается, на USB-накопителе может быть назначен диск E: ему назначен (WinXP), а на других компьютерах (Vista/7) это может быть диск F:. (Кажется, нет способа статически назначить букву фиксированного диска USB-накопителю, когда он вставлен в порт USB.)
2 ответа
Я бы установил имя тома диска, проверил все подключенные диски и нашел диск с таким именем тома. Вот как я делаю это в PowerShell:
param([parameter(mandatory=$true)]$VolumeName,
[parameter(mandatory=$true)]$SrcDir)
# find connected backup drive:
$backupDrive = $null
get-wmiobject win32_logicaldisk | % {
if ($_.VolumeName -eq $VolumeName) {
$backupDrive = $_.DeviceID
}
}
if ($backupDrive -eq $null) {
throw "$VolumeName drive not found!"
}
# mirror
$backupPath = $backupDrive + "\"
& robocopy.exe $SrcDir $backupPath /MIR /Z
Этот код получает последний готовый к использованию съемный диск (например, только что подключенный USB-накопитель):
$drives = [System.IO.DriveInfo]::GetDrives()
$r = $drives | Where-Object { $_.DriveType -eq 'Removable' -and $_.IsReady }
if ($r) {
return @($r)[-1]
}
throw "No removable drives found."
Этот способ не требует предварительной установки имени фиксированного тома. Мы можем использовать разные USB-накопители, не зная / не устанавливая их имена.
ОБНОВЛЕНИЕ Для завершения перетаскивания части задачи вы можете сделать это.
Создайте сценарий PowerShell (используйте, например, Блокнот) C:\TEMP_110628_041140\Copy-ToRemovableDrive.ps1 (путь зависит от вас):
param($Source)
$drives = [System.IO.DriveInfo]::GetDrives()
$r = $drives | Where-Object { $_.DriveType -eq 'Removable' -and $_.IsReady }
if (!$r) {
throw "No removable drives found."
}
$drive = @($r)[-1]
Copy-Item -LiteralPath $Source -Destination $drive.Name -Force -Recurse
Создайте файл Copy-ToRemovableDrive.bat (например, на рабочем столе), он использует скрипт PowerShell:
powershell -file C:\TEMP\_110628_041140\Copy-ToRemovableDrive.ps1 %1
Теперь вы можете подключить USB-накопитель и перетащить файл на Copy-ToRemovableDrive.bat
значок на вашем рабочем столе. Это должно скопировать перетаскиваемый файл на только что подключенный USB-накопитель.