سؤال

أتساءل عما إذا كانت هناك طريقة عالمية لحل المسار باستخدام حرف محرك الأقراص (مثل 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: هي نتيجة 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