Извлечение CD

Данный скрипт проверяет наличие диска в приводе, если он присутствует, то извлекается, если нет, то скрипт завершает работу

foreach ($d in [IO.DriveInfo]::GetDrives()) {
  if (($d.DriveType -eq "CDRom") -and ($d.IsReady)) {
    Write-Host В приводе $d.Name имеется компакт диск. -f green
    $res = Read-Host Извлечь компакт диск из привода? [y/n]

    if ($res -eq "y") {
      $shell = New-Object -com Shell.Application
      $shell.NameSpace(17).ParseName($d.Name).InvokeVerb("&Извлечь")
    }
  }
}

Тоже самое, но с использованием WinAPI

#код библиотеки
$code = @'
using System;
using System.Runtime.InteropServices;

namespace LibWrap
{
  public class OpenCloseCD
  {
    [DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)]
    public static extern int mciSendString(string lpCommand,string retString,
                                               uint retLength, int callback);
  }
}
'@

#переменные (посылаемые команды)
[string]$eject = "set cdaudio door open"
[string]$close = "set cdaudio door closed"

#функция для сборки библиотеки - для PowerShell v2 в данном
#случае лучше вообще воспользоваться командлетом Add-Type
function BuildAssembly {
  $cscp = New-Object Microsoft.CSharp.CSharpCodeProvider
  $cpar = New-Object CodeDom.Compiler.CompilerParameters
  $cpar.GenerateInMemory = $true
  $exec = $cscp.CompileAssemblyFromSource($cpar, $code)
}

#узнаем состояние CD-привода через IsReady
foreach ($d in [IO.DriveInfo]::GetDrives()) {
  if (($d.DriveType -eq "CDRom") -and ($d.IsReady)) {
    BuildAssembly
    #открываем лоток привода
    [void][LibWrap.OpenCloseCD]::mciSendString($eject, $null, 0, 0)
    #делаем паузу, чтобы дать пользователю время вынуть диск
    Start-Sleep -m 5500
    #задвигаем лоток
    [void][LibWrap.OpenCloseCD]::mciSendString($close, $null, 0, 0)
  }
  elseif (($d.DriveType -eq "CDRom") -and !($d.IsReady)) {
    Write-Host В приводе $d.Name нет диска. -f magenta
  }
}

Также интересно:

 

0
Голосов пока нет

Оставить комментарий