Я недавно получил известие от кого-то, что Windows Admins должен использовать сценарии входа в систему CMD по сценариям входа в систему BAT, как выполнение или выполниться быстрее. По-видимому, сценарии BAT являются известно медленными.
Я сделал что-то вроде Google, и я не могу найти, что любое доказательство копирует то требование. Я просто задаюсь вопросом, является ли это мифом или если кто-либо может больше знать об этом?
Несмотря на некоторые различия в том, как скрипты BAT
и CMD
работают как , обсуждаемые здесь (в силу заслуг Комментарий Хаммера ), команды анализируются и выполняются одна за другой , запоминая смещение следующей команды ( 0
в начальной точке) и снова открывая файл сценария с диска для следующей команды.
1000
команд в сценарии означают 1000
дисковых операций (открытие-чтение-закрытие) с одним и тем же файлом. Для точности я говорю не о строках , а о командах .
Это реальный источник медлительности сценариев BAT
и CMD
.
Для доказательства: запустите простой пример сценария , игнорируя подсказку для удаления файл; сценарий сам наберет
:
==> 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"
Выполнить указанный выше сценарий , наблюдая подсказку, чтобы стереть файл; Пакетный файл не может быть найден. Ошибка
показывает, что пакетный анализатор не может получить следующую команду 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
кешируется в памяти. Снова запустите пример сценария , игнорируя подсказку , чтобы сначала стереть файл; сценарий сам наберет
:
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