Pregunta

Me pregunto si hay una forma universal de la resolución de un trazado con una letra de unidad (como X:\foo\bar.txt) en su ruta UNC equivalente, lo que podría ser uno de los siguientes:

  • X:\foo\bar.txt si X: es una unidad real (es decir, disco duro, memoria USB, etc.)
  • \\server\share\foo\bar.txt si X: es una unidad de red montado en \\server\share
  • C:\xyz\foo\bar.txt si X: es el resultado de un comando de asignación SUBST X: a C:\xyz

Sé que hay soluciones parciales que hará lo siguiente:

  1. resolver una unidad de red (véase, por ejemplo pregunta 556.649 que se basa en WNetGetUniversalName)

  2. Resolver la letra de unidad SUBST (ver QueryDosDevice que funciona como se esperaba, pero no devuelve rutas UNC para cosas tales como las unidades locales o unidades de red).

Me estoy perdiendo de alguna manera sencilla de implementar esta resolución letra de unidad en Win32? O es lo que realmente tiene que meterse con tanto WNetGetUniversalName y QueryDosDevice para conseguir lo que necesito?

¿Fue útil?

Solución

Sí, lo que se necesita para resolver la letra de la unidad de forma independiente.

WNetGetUniversalName() se acerca, pero sólo funciona para las letras de unidad que se asignan a las acciones reales UNC, que no es siempre el caso. No hay función de API única que hace todo el trabajo por usted.

Otros consejos

Aquí está un lote de traducir las letras de unidad a las rutas UNC o revertir caminos substed. No se garantiza que funciona sin embargo.

Ejemplo de uso: 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!
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top