4 votes

Supprimer un périphérique USB à partir de la ligne de commande

Je voudrais une commande que je puisse mettre à la fin d'un fichier batch et qui me permette de supprimer en toute sécurité le périphérique usb où est stocké le fichier batch.

J'ai trouvé une commande powershell qui peut réaliser ceci mais quand j'essaie de l'exécuter depuis cmd cela ne fonctionne pas ("%~d0" est la variable pour le chemin USB) :

powershell -command "$driveEject = New-Object -comObject Shell.Application ; $driveEject.Namespace(17).ParseName("%~d0").InvokeVerb("Eject")"

Voici le message d'erreur que je reçois :

At line:1 char:93
+ ... ject Shell.Application ; $driveEject.Namespace(17).ParseName(E:).Invo ...
+                                                                  ~
Missing ')' in method call.
At line:1 char:93
+ ... ct Shell.Application ; $driveEject.Namespace(17).ParseName(E:).Invoke ...
+                                                                ~~
Unexpected token 'E:' in expression or statement.
At line:1 char:95
+ ... t Shell.Application ; $driveEject.Namespace(17).ParseName(E:).InvokeV ...
+                                                                 ~
Unexpected token ')' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndParenthesisInMethodCall

1voto

JosefZ Points 11907

À propos des règles de citation L'article décrit les règles d'utilisation des guillemets simples et doubles dans PowerShell. Utilisez

…; $driveEject.Namespace(17).ParseName('%~d0').InvokeVerb('Eject')"

ou (vous devez échapper aux guillemets internes pour cmd également)

…; $driveEject.Namespace(17).ParseName("""%~d0""").InvokeVerb("""Eject""")"

Cependant, un Powershell Meilleure pratique source déprécie ce dernier : Il est recommandé d'éviter les guillemets doubles s'il n'y a pas de variables ou de séquences d'échappement dans les chaînes de caractères, préférez les guillemets simples. .

1voto

postanote Points 3762

En plus de ce que @JoseZ vous a donné, si vous placez cette ligne unique dans l'ISE PoSH ou le VSCode, vous verrez que le codage couleur indique les erreurs de syntaxe. Les propriétés en pointillés doivent être de couleur noire. Ainsi, vos .Namespace, .ParseName et .InvokeVerb sont affichés comme des chaînes de caractères, indiquées par la couleur, et vont donc échouer.

Essayez de cette façon, en supprimant toutes les variables, ce qui élimine tous les éléments supplémentaires d'échappement des guillemets.

powershell -command "(New-Object -comObject Shell.Application).NameSpace(17).ParseName('F:').InvokeVerb('Eject')"

Testé sur un de mes systèmes, donc je sais que cela fonctionne comme écrit.

Enfin, puisque vous pouvez et prévoyez d'utiliser PoSH pour cela, pourquoi l'utilisation d'un fichier batch ?

0voto

Zimba Points 753

CMD n'a pas de fonction implémentée pour éjecter les clés USB. Il peut cependant appeler des objets COM Win qui ont les fonctions nécessaires implémentées, par exemple Shell.Application via powershell, VBS, JS, etc.

L'éjection d'un disque via powershell nécessite également qu'il soit débranché et rebranché pour être remonté. Sinon, le disque peut simplement être démonté et devenir inaccessible jusqu'à ce qu'il soit remonté par l'une des méthodes suivantes mountvol ou diskpart .

par exemple, avec mountvol :

REM unmount
mountvol e: /D or /P
REM mount for access
mountvol e: \\?\Volume{device GUID in hex with hyphens}\

mountvol permet de monter des périphériques dans un dossier, par exemple. C:\fakedisk\ ainsi qu'une lettre de lecteur.

ex. Avec diskpart :

REM unmount
(
echo select volume 3
echo remove letter=e dismount
) | diskpart

REM mount again for access
(
echo select volume 3
echo assign letter=e
) | diskpart

Testé dans Win 10 cmd

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X