5 votes

Ligne de commande par lot pour éjecter le plateau CD ?

Je suis actuellement en train de transférer mes CD de sauvegarde vers mon disque dur de sauvegarde.

Pour automatiser la tâche, j'essaie de créer un lot pour copier les fichiers avec l'étiquette du CD, puis éjecter le support.

Le code ressemble pour le moment à ceci :

@echo off 
SET dest=F:\Backup\

d:

:: routine pour récupérer l'étiquette du volume.
for /f "tokens=1-5*" %%1 in ('vol') do (
   set vol=%%6 & goto done
)
:done

:: créer un dossier de destination
set dest=%dest%%vol%
mkdir "%dest%"

:: copier dans le dossier de destination
xcopy "d:" "%dest%" /i /s /exclude:c:\excludes.txt

:: éjecter le CD

c:

Je suis bloqué à la partie d'éjection. J'essaie d'éjecter le CD parce que je veux une ligne claire pour attirer mon attention lorsque la copie sera terminée (j'ai pensé qu'ouvrir le plateau était une bonne idée).

Des idées sur la manière de le faire avec Batch ? Ou d'autres façons de "attirer l'attention" vers la fin de l'événement de copie ?

Merci :)

8voto

npocmaka Points 7794

Si vous n'avez pas de lecteur multimédia ou d'alarmes antivirus installés, vérifiez ma autre réponse.

:sub echo(str) :end sub
echo off
'>nul 2>&1|| copy /Y %windir%\System32\doskey.exe '.exe >nul

'& cls
'& cscript /nologo /E:vbscript %~f0
'& pause

Set oWMP = CreateObject("WMPlayer.OCX.7" )
Set colCDROMs = oWMP.cdromCollection

if colCDROMs.Count >= 1 then
        For i = 0 to colCDROMs.Count - 1
                colCDROMs.Item(i).Eject
        Next ' cdrom
End If

Ceci est un batch/vbscript hybride (vous devez l'enregistrer en tant que batch). Je ne pense pas que cela soit possible avec un simple batch. Sur windows 8/8.1, il peut être nécessaire de télécharger windows media player (la colonne la plus à droite). Certains programmes antivirus pourraient vous avertir concernant ce script.

5voto

Bruno Points 77

Je sais que cette question est ancienne, mais je voulais partager ceci :

@echo off
echo Set oWMP = CreateObject("WMPlayer.OCX.7")  >> %temp%\temp.vbs
echo Set colCDROMs = oWMP.cdromCollection       >> %temp%\temp.vbs
echo For i = 0 to colCDROMs.Count-1             >> %temp%\temp.vbs
echo colCDROMs.Item(i).Eject                    >> %temp%\temp.vbs
echo next                                       >> %temp%\temp.vbs
echo oWMP.close                                 >> %temp%\temp.vbs
%temp%\temp.vbs
timeout /t 1
del %temp%\temp.vbs

Assurez-vous simplement de ne pas avoir de fichier appelé "temp.vbs" dans votre dossier Temp. Cela peut être exécuté directement via une invite de commandes, vous n'avez pas besoin d'un lot, mais je ne connais aucune commande comme "eject E:\". N'oubliez pas que cela éjectera tous les tiroirs de CD de votre système.

3voto

npocmaka Points 7794

MISE À JOUR :

Un script qui prend également en charge l'éjection de clés USB - ejectjs.bat :

::pour éjecter un disque spécifique par lettre
call ejectjs.bat G
::pour éjecter tous les lecteurs pouvant être éjectés
call ejectjs.bat *

Une bien meilleure façon qui ne nécessite pas Windows Media Player et n'est pas encore reconnue par les programmes antivirus. Doit être enregistré avec l'extension .bat :

 @cScript.EXE //noLogo "%~f0?.WSF"  //job:info %~nx0 %*
@exit /b 0

        if WScript.Arguments.Count < 2 then
            WScript.Echo "Aucune lettre de lecteur passée"
            WScript.Echo "Usage: " 
            WScript.Echo "  " & WScript.Arguments.Item(0) & " {LETTRE|*}"
            WScript.Echo "  * éjectera tous les lecteurs de CD"
            WScript.Quit 1
        end if
        driveletter = WScript.Arguments.Item(1):
        driveletter = mid(driveletter,1,1):

        Public Function ejectDrive (drvLtr)
            Set objApp = CreateObject( "Shell.Application" ):
            Set objF=objApp.NameSpace(&H11&):
            'WScript.Echo(objF.Items().Count):
            set MyComp = objF.Items():
            for each item in objF.Items() :
                iName = objF.GetDetailsOf (item,0): 
                iType = objF.GetDetailsOf (item,1): 
                iLabels = split (iName , "(" ) :
                iLabel = iLabels(1):

                if Ucase(drvLtr & ":)") = iLabel and iType = "CD Drive" then
                    set verbs=item.Verbs():
                    set verb=verbs.Item(verbs.Count-4):
                    verb.DoIt():
                    item.InvokeVerb replace(verb,"&","") :
                    ejectDrive = 1:
                    exit function:

                end if
            next    
            ejectDrive = 2:
        End Function

        Public Function ejectAll ()
            Set objApp = CreateObject( "Shell.Application" ):

            Set objF=objApp.NameSpace(&H11&):
            'WScript.Echo(objF.Items().Count):
            set MyComp = objF.Items():
            for each item in objF.Items() :
                iType = objF.GetDetailsOf (item,1):                                 
                if  iType = "CD Drive" then
                    set verbs=item.Verbs():
                    set verb=verbs.Item(verbs.Count-4):
                    verb.DoIt():
                    item.InvokeVerb replace(verb,"&","") :
                end if

            next
        End Function
        if driveletter = "*" then 
            call ejectAll
            WScript.Quit 0
        end if
        result = ejectDrive (driveletter):

        if result = 2 then
            WScript.Echo "aucun lecteur de CD trouvé avec la lettre " & driveletter & ":"
            WScript.Quit 2
        end if

1voto

Denis Barmenkov Points 1190

Exiger les droits d'administrateur est trop abusif :)

Je utilise wizmo : https://www.grc.com/WIZMO/WIZMO.HTM

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X