Lösen Windows-Laufwerksbuchstaben zu einem Pfad (subst und Netzwerk)
-
18-09-2019 - |
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
wennX:
ist ein echtes Laufwerk (das heißt Festplatte, USB-Stick, etc.). -
\\server\share\foo\bar.txt
wennX:
ist ein Netzlaufwerk auf\\server\share
montiert -
C:\xyz\foo\bar.txt
wennX:
das Ergebnis einerSUBST
Befehl MappingX:
istC:\xyz
Ich weiß, dass es Teillösungen die:
-
ein Netzlaufwerk auflösen (siehe zum Beispiel: Frage 556.649 , die auf
WNetGetUniversalName
beruht) -
den
SUBST
Laufwerksbuchstabe auflösen (sieheQueryDosDevice
, 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?
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!