최근 누군가로부터 Windows 관리자가 더 빠르게 실행하려면 BAT 로그온 스크립트 대신 CMD 로그온 스크립트를 사용해야 한다는 말을 들었습니다. 분명히 BAT 스크립트는 느린 것으로 악명이 높습니다.
나는 약간의 Google을 수행했지만 그 주장을 뒷받침할 증거를 찾을 수 없습니다. 이것이 신화인지 아니면 이에 대해 더 이상 알 수 있는 사람이 있는지 궁금합니다.
답변1
스크립트가 작동하는 방식 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