Как я могу найти замены букв дисков Windows, используемые для всех моих рабочих деревьев git, с помощью одной команды?

У меня есть пакетный файл, который я использую для сохранения букв дисков для локальных путей. Поскольку они нестабильны, я сохраняю их в текстовый файл, который читается при загрузке компьютера. Это позволяет мне иметь локальные «сопоставленные» диски. Сохраненный текстовый вывод из «subst». Local_Map.txt:

F:\: => C:\tools\dev\Tools
M:\: => C:\tools\dev\Tools_Master_Worktree
W:\: => C:\tools\dev\Tools_ALT_Worktree
X:\: => C:\tools\dev\Tools_Xtra_Worktree

Мне приходилось так часто переходить из одной ветки git в другую, что мне пришлось использовать несколько рабочих деревьев. Я использую bash, и очень удобно всего лишь набрать «cd /m» и переключиться на ветку моего рабочего дерева, которая находится под псевдонимом «m». Моя проблема в том, что я забываю, в какой ветке и под каким псевдонимом я оформляю заказ. Это легко увидеть, когда я переключаюсь на псевдоним, потому что имя ветки отображается в командной строке bash. MINGW64 /m (myBranch_1.2.3) $ В конечном итоге мне приходится переключаться на каждый псевдоним, пока я не найду рабочее дерево с нужной мне веткой. Если я использую список рабочих деревьев git, он показывает мне проверку ветвей на каждом рабочем дереве, но он не знает букву подсистемы диска, которую я назначил этому пути. список рабочих деревьев git:

C:/tools/dev/Tools                  a1a2abdf4 [reviewBranch_1.2.3]
C:/tools/dev/Tools_ALT_Worktree     1ace7f077 [myBranch_in-work]
C:/tools/dev/Tools_Master_Worktree  19a1277ba [myBranch_1.2.3]
C:/tools/dev/Tools_Xtra_Worktree    ddd960a7d [myAltBranch]

Если я наберу «subst» в командной строке bash, он покажет мне все псевдонимы дисков и пути, но не отобразит информацию о ветке git. Я думаю, мне нужно написать сценарий bash или пакетный файл, к которому я затем смогу получить доступ из любого места, который будет приравнивать вывод списка рабочего дерева git к выводу subst и показывать мне мой диск с псевдонимом для ветвей рабочего дерева. Какая-то форма этого вывода была бы идеальна, если бы она у меня была.

F:\ [reviewBranch_1.2.3]
M:\ [myBranch_in-work]
W:\ [myBranch_1.2.3]
X:\ [myAltBranch]

Есть ли у кого-нибудь совет о самом простом способе добиться этого?

Это пакет, который запускается при запуске и считывает сохраненный текстовый файл.

 for /F "tokens=1,2,*" %%i in (C:\Batch_Files\Local_Map.txt) do (
   if exist %%~di subst %%~di /D 
   subst %%~di %%k
   )

Это мой локальный пакет интерфейса «сопоставленного» диска.

@echo off
wmic logicaldisk get Name, VolumeName
REM Path_Map_Boot_Up.bat runs at startup to load subst's from txt file

REM for /F "tokens=1,2,*" %%i in (C:\Batch_Files\Local_Map.txt) do (
REM     if exist %%~di subst %%~di /D 
REM     subst %%~di %%k
REM     )

echo.

 subst

echo.

set /p new= Map Drive(m) Delete Map(d) Refresh(r) Quit(q):

CALL :%new% 
  CLS 
  %0 

:m
  set /p drive=Enter Drive Letter:
  if exist %drive%: subst %drive%: /D 
  set /p mp= Set map path:
  subst %drive%: %mp%

    subst >"C:\Batch_Files\Local_Map.txt"

  EXIT /B
:d
  set /p drive=Enter Drive Letter:
 REM if exist %drive%: subst %drive%: /D
  subst %drive%: /D
  subst >"C:\Batch_Files\Local_Map.txt"
  EXIT /B
:q
  EXIT

1
60
1

Ответ:

Решено

Можно использовать следующий пакетный файл Windows, обработанный командным процессором Windows cmd.exe, если ни один путь к каталогу не содержит пробелов.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=1,3" %%G in ('git.exe worktree list') do ( 
    set "BranchDirectory=%%G"
    set "BranchName=%%H"
    for /F "tokens=1* delims=:=>\ " %%I in ('subst') do (
        set "DriveDirectory=%%J"
        setlocal EnableDelayedExpansion
        if /I "!BranchDirectory!" == "!DriveDirectory:\=/!" echo %%I:\ !BranchName! !DriveDirectory!
        endlocal
    )
)   
endlocal

Можно использовать даже однострочный пакетный файл, если ни один путь к каталогу не содержит пробела:

@for /F "tokens=1,3" %%G in ('git.exe worktree list') do @for %%K in ("%%G") do @for /F "tokens=1* delims=:=>\ " %%I in ('subst') do @if /I "%%~fK" == "%%J" echo %%I:\ %%H %%J

Другое решение для пакетного файла, запускаемое subst только один раз, будет:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Drives = " & (for /F "tokens=1* delims=:=>\ " %%I in ('subst') do set "DirectoryPath=%%J" & set "DriveLetter=%%I" & call :AppendDrive) & goto ProcessList
:AppendDrive
set Drives=%Drives% "%DriveLetter%|%DirectoryPath%"& goto :EOF
:ProcessList
if defined Drives for /F "tokens=1,3" %%G in ('git.exe worktree list') do for %%K in ("%%G") do for %%L in (%Drives%) do for /F "tokens=1,2 delims=|" %%I in (%%L) do if /I "%%~fK" == "%%J" echo %%I:\ %%H %%J
endlocal

'subst' можно заменить во всех трех пакетных файлах на C:\Batch_Files\Local_Map.txt для чтения списка путей к каталогам, связанным с буквой диска, с помощью команды subst из текстового файла вместо вывода команды subst, выполняемой путем cmd.exe обработки пакетного файла в фоновом режиме :

%ComSpec% /c subst

Ссылку на отложенную расширенную переменную среды !DriveDirectory! в первом пакетном файле соответственно ссылку на переменную цикла %%J во втором и третьем пакетных файлах можно удалить из конца команды echo только на букве диска с двоеточием и обратной косой чертой, а имя ветки имеет вид интерес и нет пути к каталогу.

Чтобы понять, какие команды используются и как они работают, откройте окно командной строки , выполните там следующие команды и внимательно прочитайте отображаемые страницы справки для каждой команды.

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

Прочтите одну строку с несколькими командами с использованием пакетного файла Windows для объяснения оператора безусловной команды &, используемого в третьем пакетном файле для уменьшения количества командных строк в пакетном файле, обрабатываемых командным процессором Windows.