Недавно я услышал от кого-то, что администраторы Windows должны использовать сценарии входа в систему CMD вместо сценариев входа в систему BAT, чтобы запускать или выполнять быстрее. Очевидно, сценарии BAT заведомо медленные.
Я немного погуглил и не могу найти никаких доказательств, подтверждающих это утверждение. Мне просто интересно, миф ли это или кто-нибудь может знать об этом больше?
Несмотря на некоторые различия в том, как BAT
и CMD
скрипты работают как обсуждается здесь (в силу похвального Комментарий Хаммера), команды разбираются и выполняются один за другим запоминая смещение следующей команды (0
в начальной точке) и снова открыть файл сценария с диска для следующей команды.
1000
команды в сценарии означают 1000
дисковые операции (открытие-чтение-закрытие) над одним и тем же файлом. Я не говорю о линии но о команды.
Это реальный источник обоих BAT
и CMD
медлительность скриптов.
Для доказательства: запустите простой пример скрипта игнорирование подсказка стереть файл; сценарий будет type
сам:
==> 725431.cmd
725431.cmd script. Please follow instructions.
Press any key to continue . . .
Please erase d:\bat\725431.cmd file prior to continuing.
Press any key to continue . . .
you didn't erase d:\bat\725431.cmd file prior to continuing?
---
@echo off
echo %~nx0 script. Please follow instructions.
pause
echo Please erase %~f0 file prior to continuing.
pause
echo you didn't erase %~f0 file prior to continuing?
echo ---
type "%~f0"
Запустить сценарий выше наблюдение подсказка стереть файл; The batch file cannot be found
ошибка показывает, что парсер не может получить следующий echo
команда:
==> 725431.cmd
725431.cmd script. Please follow instructions.
Press any key to continue . . .
Please erase d:\bat\725431.cmd file prior to continuing.
Press any key to continue . . .
The batch file cannot be found.
Для полноты картины вот стандартное сообщение об ошибке файловой системы:
==> type 725431.cmd
The system cannot find the file specified.
Напротив, похожие (например) PowerShell
сценарий кешируется в памяти. Снова запустите образец сценария игнорирование подсказка, чтобы сначала стереть файл; сценарий будет type
сам:
PS D:\PShell> D:\PShell\SF\725431.ps1
D:\PShell\SF\725431.ps1 script. Please follow instructions.
Press Enter to continue...:
Please erase D:\PShell\SF\725431.ps1 file prior to continuing.
Press Enter to continue...:
you didn't erase D:\PShell\SF\725431.ps1 file prior to continuing?
---
echo "$PSCommandPath script. Please follow instructions."
pause
echo "Please erase $PSCommandPath file prior to continuing."
pause
echo "you didn't erase $PSCommandPath file prior to continuing?"
echo "---"
Get-Content $PSCommandPath
Запускаем скрипт наблюдение подсказка стереть файл. Это покажет, что последний echo
и Get-Content
были кешированы в памяти:
PS D:\PShell> D:\PShell\SF\725431.ps1
D:\PShell\SF\725431.ps1 script. Please follow instructions.
Press Enter to continue...:
Please erase D:\PShell\SF\725431.ps1 file prior to continuing.
Press Enter to continue...:
you didn't erase D:\PShell\SF\725431.ps1 file prior to continuing?
---
Get-Content : Cannot find path 'D:\PShell\SF\725431.ps1' because it does not ex
ist.
At D:\PShell\SF\725431.ps1:8 char:1
+ Get-Content $PSCommandPath
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (D:\PShell\SF\725431.ps1:String)
[Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetCo
ntentCommand