Pergunta

Gostaria de saber se existe uma maneira universal de resolver um caminho usando uma letra de unidade (como X:\foo\bar.txt) em seu caminho UNC equivalente, que pode ser um dos seguintes:

  • X:\foo\bar.txt se X: é uma verdadeira unidade (ou seja, disco rígido, stick USB, etc.)
  • \\server\share\foo\bar.txt se X: é uma unidade de rede montada em \\server\share
  • C:\xyz\foo\bar.txt se X: é o resultado de um mapeamento de comando SUBST X: para C:\xyz

Eu sei que existem soluções parciais que irá:

  1. Resolver uma unidade de rede (ver, por exemplo, questão 556.649 que se baseia em WNetGetUniversalName)

  2. Resolver a letra da unidade SUBST (veja QueryDosDevice que funciona como esperado, mas não retorna caminhos UNC para coisas tais como unidades locais ou unidades de rede).

Am I faltando alguma maneira simples de implementar esta resolução letra de unidade no Win32? Ou eu realmente tem que mexer com tanto WNetGetUniversalName e QueryDosDevice para conseguir o que eu preciso?

Foi útil?

Solução

Sim, você precisaria para resolver a letra da unidade de forma independente.

WNetGetUniversalName() chega perto, mas só funciona para letras de unidade que são mapeadas para compartilhamentos UNC reais, o que nem sempre é o caso. Não há nenhuma função única API que faz todo o trabalho para você.

Outras dicas

Aqui está um lote de traduzir as letras de unidade para caminhos UNC ou caminhos SUBST inversa. Não garantida funciona embora.

Exemplo de utilização: 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top