문제

드라이브 레터 (예 : X:\foo\bar.txt) 동등한 UNC 경로로 다음 중 하나 일 수 있습니다.

  • X:\foo\bar.txt 만약에 X: 실제 드라이브입니다 (예 : 하드 디스크, USB 스틱 등)
  • \\server\share\foo\bar.txt 만약에 X: 네트워크 드라이브가 장착되었습니다 \\server\share
  • C:\xyz\foo\bar.txt 만약에 X: a의 결과입니다 SUBST 명령 매핑 X: 에게 C:\xyz

나는 부분 솔루션이 있다는 것을 알고있다 :

  1. 네트워크 드라이브를 해결하십시오 (예 : 참조 질문 556649 의존합니다 WNetGetUniversalName)

  2. 해결하십시오 SUBST 드라이브 레터 (참조 QueryDosDevice 예상대로 작동하지만 로컬 드라이브 또는 네트워크 드라이브와 같은 것에 대한 UNC 경로를 반환하지는 않습니다).

Win32 에서이 드라이브 레터 해상도를 구현하는 간단한 방법이 없습니까? 아니면 두 가지를 정말로 엉망으로 만들어야합니까? WNetGetUniversalName 그리고 QueryDosDevice 내가 필요한 것을 얻기 위해?

도움이 되었습니까?

해결책

예, 드라이브 레터를 독립적으로 해결해야합니다.

WNetGetUniversalName() 가까이오고 있지만 실제 UNC 주식에 매핑 된 드라이브 문자에 대해서만 작동합니다. 항상 그렇지는 않습니다. 모든 작업을 수행하는 단일 API 기능이 없습니다.

다른 팁

다음은 드라이브 문자를 UNC 경로 또는 반대로 변형 경로로 번역하는 배치입니다. 그래도 보장되지는 않습니다.

사용의 예 : 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!
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top