Frage

Ich frage mich, ob es eine universelle Art und Weise ist es, einen Weg zur Lösung unter Verwendung eines Laufwerksbuchstaben (wie X:\foo\bar.txt) in sein Äquivalent UNC-Pfad, die eine der folgenden sein könnte:

  • X:\foo\bar.txt wenn X: ist ein echtes Laufwerk (das heißt Festplatte, USB-Stick, etc.).
  • \\server\share\foo\bar.txt wenn X: ist ein Netzlaufwerk auf \\server\share montiert
  • C:\xyz\foo\bar.txt wenn X: das Ergebnis einer SUBST Befehl Mapping X: ist C:\xyz

Ich weiß, dass es Teillösungen die:

  1. ein Netzlaufwerk auflösen (siehe zum Beispiel: Frage 556.649 , die auf WNetGetUniversalName beruht)

  2. den SUBST Laufwerksbuchstabe auflösen (siehe QueryDosDevice, die wie erwartet funktioniert, aber nicht zurück UNC-Pfade für Dinge wie lokale Laufwerke oder Netzlaufwerke).

Fehle ich einige einfache Möglichkeit, diese Laufwerksbuchstaben Auflösung in Win32 der Umsetzung? Oder muss ich wirklich zu Chaos mit beiden WNetGetUniversalName und QueryDosDevice zu bekommen, was ich brauche?

War es hilfreich?

Lösung

Ja, müssen Sie die Laufwerksbuchstabe unabhängig zu lösen.

WNetGetUniversalName() nahe kommt, funktioniert aber nur für Laufwerksbuchstaben, die auf tatsächlichen UNC Aktien abgebildet werden, was nicht immer der Fall ist. Es gibt keine einzige API-Funktion, die für Sie die gesamte Arbeit der Fall ist.

Andere Tipps

Hier ist ein Batch-Laufwerksbuchstaben zu UNC-Pfade zu übersetzen oder SUBST Wege zu umkehren. Nicht garantiert funktioniert es aber.

Anwendungsbeispiel: 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!
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top