A única maneira de fazer esse IMO sem o uso de 3 utilitários de partido rd (como NirCmd e Wizmo ) seriam via VBScript ou PowerShell . Todas as soluções VBScript que vi até agora usam um desatualizado Windows Media Player OCX. Não sei se as versões mais recentes do WMP incluem um OCX com funcionalidade semelhante ou não, além de desativá-lo / desinstalá-lo via Recursos do Windows pode interferir no funcionamento do script em qualquer caso.
Uma maneira comum de implementar essa funcionalidade por meio do código é usando o MCI (Media Control Interface) APIs (especificamente, o set comando ). No entanto, como o VBScript não oferece suporte a chamada funções normais da API do Windows ou até mesmo funções de DLLs arbitrárias, que nos deixa com o PowerShell. Assim, o seguinte deve funcionar fora da caixa no Windows 7+ que vem com o PS pré-instalado e no XP / Vista após o PS ser instalado. A DLL MCI, ou seja, Windows \ System32 \ WinMM.dll, deve estar disponível como parte da instalação padrão no XP +.
1) Salve o seguinte como CD_Open.ps1 :
$cd = Add-Type -memberDefinition @"
[DllImport("winmm.dll", CharSet = CharSet.Ansi)] public static extern int mciSendStringA(string lpstrCommand, string lpstrReturnString, int uReturnLength, IntPtr hwndCallback);
"@ -passthru -name mciSendString
$cd::mciSendStringA('set cdaudio door open', $null, 0, 0);
2) Salve o seguinte como CD_Close.ps1 :
$cd = Add-Type -memberDefinition @"
[DllImport("winmm.dll", CharSet = CharSet.Ansi)] public static extern int mciSendStringA(string lpstrCommand, string lpstrReturnString, int uReturnLength, IntPtr hwndCallback);
"@ -passthru -name mciSendString
$cd::mciSendStringA("set cdaudio door closed", $null, 0, 0);
Agora vem o problema. Por padrão, os scripts PS não assinados não podem ser executados no Windows por motivos de segurança. Digite get-help about_signing
no prompt do PS para saber mais sobre isso, incluindo como assinar seus scripts e assim por diante.
Por sorte, há uma solução alternativa conforme o comando get-help acima:
TO PERMIT SIGNED SCRIPTS TO RUN
-------------------------------
When you start Windows PowerShell on a computer for the first time, the
Restricted execution policy (the default) is likely to be in effect.
The Restricted policy does not permit any scripts to run.
To find the effective execution policy on your computer, type:
get-executionpolicy
To run unsigned scripts that you write on your local computer and signed
scripts from other users, use the following command to change the execution
policy on the computer to RemoteSigned:
set-executionpolicy remotesigned
For more information, see Set-ExecutionPolicy.
3) Então, a partir de um Prompt de Comando elevado , execute o seguinte comando:
powershell set-executionpolicy remotesigned
(Você pode executar powershell set-executionpolicy restricted
para reverter para a configuração padrão.)
Esse comando precisa ser executado apenas uma vez e permanece em vigor até que você altere a política de execução novamente.
4) Agora você pode usar os seguintes comandos (mesmo de um Prompt de Comando não elevado) para abrir / fechar a bandeja da unidade óptica:
powershell -file CD_Open.ps1
powershell -file CD_Close.ps1
Você também pode criar atalhos para abrir / fechar a bandeja com um clique ou com uma combinação de teclas:
VocêtambémpodeadicionarocomandoFecharaomenudecontextodasuaunidadeópticausandooseguintearquivo.REG:
WindowsRegistryEditorVersion5.00[HKEY_CLASSES_ROOT\SystemFileAssociations\Drive.CDROM\shell]@="none"
[HKEY_CLASSES_ROOT\SystemFileAssociations\Drive.CDROM\shell\closetray]
@="Close"
[HKEY_CLASSES_ROOT\SystemFileAssociations\Drive.CDROM\shell\closetray\command]
@="C:\Windows\System32\WindowsPowerShell\v1.0\Powershell.exe -windowstyle hidden -file I:\CD_Close.ps1"
(Edite os caminhos conforme necessário. Além disso, o parâmetro -WindowStyle só está disponível no PS 2.0 +.)