Resolve lettre de lecteur Windows à un chemin (réseau et Subst)
-
18-09-2019 - |
Question
Je me demande s'il y a un moyen universel de résoudre un chemin en utilisant une lettre de lecteur (par exemple X:\foo\bar.txt
) dans son chemin UNC équivalent, ce qui pourrait être l'un des éléments suivants:
-
X:\foo\bar.txt
siX:
est un lecteur réel (à savoir le disque dur, clé USB, etc.) -
\\server\share\foo\bar.txt
siX:
est une unité de réseau monté sur\\server\share
-
C:\xyz\foo\bar.txt
siX:
est le résultat d'uneSUBST
de mappage de commandeX:
àC:\xyz
Je sais qu'il existe des solutions partielles qui:
-
Résoudre un lecteur réseau (voir par exemple question 556649 qui repose sur
WNetGetUniversalName
) -
Resolve la lettre de lecteur de
SUBST
(voirQueryDosDevice
qui fonctionne comme prévu, mais ne retourne pas les chemins UNC pour des choses telles que les lecteurs locaux ou les lecteurs réseau).
Suis-je manque une certaine façon simple de mettre en œuvre cette résolution de lettre de lecteur dans Win32? Ou dois-je vraiment jouer avec les deux WNetGetUniversalName
et QueryDosDevice
pour obtenir ce que je dois?
La solution
Oui, vous devez résoudre la lettre de lecteur de manière indépendante.
WNetGetUniversalName()
est proche, mais ne fonctionne que pour les lettres de lecteur qui sont mis en correspondance avec des partages UNC réels, ce qui est pas toujours le cas. Il n'y a pas de fonction API unique qui fait tout le travail pour vous.
Autres conseils
Voici un lot de traduire les lettres de lecteur à chemins UNC ou inverser les chemins substed. Non garanti cela fonctionne bien.
Exemple d'utilisation: script.cmd echo Z: Y: W:
@echo off
:: u is a variable containing all arguments of the current command line
set u=%*
:: enabledelayedexpansion: exclamation marks behave like percentage signs and enable
:: setting variables inside a loop
setlocal enabledelayedexpansion
:: parsing result of command subst
:: format: I: => C:\foo\bar
:: variable %G will contain I: and variable H will contain C:\foo\bar
for /f "tokens=1* delims==> " %%G IN ('subst') do (
set drive=%%G
:: removing extra space
set drive=!drive:~0,2!
:: expanding H to a short path in order not to break the resulting command line
set subst=%%~sfH
:: replacing command line.
call set u=%%u:!drive!=!subst!%%
)
:: parsing result of command net use | findstr \\ ; this command is not easily tokenized because not always well-formatted
:: testing whether token 2 is a drive letter or a network path.
for /f "tokens=1,2,3 delims= " %%G IN ('net use ^| findstr \\') do (
set tok2=%%H
if "!tok2:~0,2!" == "\\" (
set drive=%%G
set subst=%%H
) else (
set drive=%%H
set subst=%%I
)
:: replacing command line.
call set u=%%u:!drive!=!subst!%%
)
call !u!