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 si X: est un lecteur réel (à savoir le disque dur, clé USB, etc.)
  • \\server\share\foo\bar.txt si X: est une unité de réseau monté sur \\server\share
  • C:\xyz\foo\bar.txt si X: est le résultat d'une SUBST de mappage de commande X: à C:\xyz

Je sais qu'il existe des solutions partielles qui:

  1. Résoudre un lecteur réseau (voir par exemple question 556649 qui repose sur WNetGetUniversalName)

  2. Resolve la lettre de lecteur de SUBST (voir QueryDosDevice 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?

Était-ce utile?

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!
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top