У меня есть пакетный файл, который я использую для сохранения букв дисков для локальных путей. Поскольку они нестабильны, я сохраняю их в текстовый файл, который читается при загрузке компьютера. Это позволяет мне иметь локальные «сопоставленные» диски. Сохраненный текстовый вывод из «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
Можно использовать следующий пакетный файл 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.