Почему получение имени файла происходит медленно, когда пакетный скрипт выполняется по UNC-пути, но печать полного пути к файлу довольно быстрая?

180
ggaur

Вот пакетный скрипт, присутствующий на удаленной машине: test.cmd

 @echo off echo %TIME% echo batch file path = %0 echo %TIME% echo file name without extension = %~n0 echo %TIME% echo file name with extension = %~nx0 echo %TIME% 

Когда я выполняю его, неожиданно получается получить полный путь довольно быстро, но получить информацию об имени файла довольно медленно. Может кто-нибудь объяснить, почему это так?

Microsoft Windows [Version 6.3.9600] (c) 2013 Microsoft Corporation. All rights reserved.  C:\Users\Gaurav>\\remote-machine\F$\Users\Gaurav\test.cmd 4:37:47.35 batch file path = \\remote-machine\F$\Users\Gaurav\test.cmd 4:37:47.35 file name without extension = test 4:37:54.21 file name with extension = test.cmd 4:38:01.07 

Сроки для местного запуска:

F:\Users\Gaurav>test.cmd 8:32:01.45 batch file path = test.cmd 8:32:01.45 file name without extension = test 8:32:01.45 file name with extension = test.cmd 8:32:01.45 
0
ну, «% 0» не требует расширения оболочкой, но «% ~ n0» делает, а «% ~ nx0», вероятно, расширяется в два раза. Когда вы запрашиваете расширение, пакетный файл должен вызывать дополнительный код в оболочке для контекстного расширения пути, и это занимает больше времени, чем простое отображение% 0, которое уже было до запуска первого таймера. Frank Thomas 5 лет назад 0
@FrankThomas Но если я делаю то же самое на локальной машине, это довольно быстро. Так как же расширение играет роль в сетевом пути? Отредактировал сам вопрос с подробностями локального прогона. ggaur 5 лет назад 0
Выполнение любого файла CMD или BAT по сетевому пути всегда намного медленнее, чем выполнение локальной копии. CMD ОЧЕНЬ неэффективен в этом. Это может быть единственной причиной этого. Tonny 5 лет назад 0
потому что расширение оболочки пути UNC включает в себя гораздо больше, чем расширение статического локального пути. Исходя из вашего времени, он запрашивает у SMB информацию о пути, поэтому компонент имени хоста будет следовать тем же правилам поиска, что и все пути SMB (сначала проверьте файл хоста, затем список браузеров, затем dns, затем широковещательную / многоадресную рассылку). ... Frank Thomas 5 лет назад 0

0 ответов на вопрос

Похожие вопросы