Ich habe kürzlich von jemandem gehört, dass Windows-Administratoren CMD-Anmeldeskripte anstelle von BAT-Anmeldeskripten verwenden sollten, da diese schneller ausgeführt werden. Anscheinend sind BAT-Skripte notorisch langsam.
Ich habe ein bisschen gegoogelt und kann keine Beweise finden, die diese Behauptung stützen. Ich frage mich nur, ob das ein Mythos ist oder ob irgendjemand mehr darüber wissen kann?
Antwort1
Ungeachtet einiger Unterschiede in der Funktionsweise BAT
und CMD
Skriptehier besprochen(aufgrund verdienstvollerHammers Kommentar), Befehle werden analysiert und ausgeführteiner nach demanderenDadurch wird der Offset des nächsten Befehls ( 0
am Startpunkt) gespeichert und die Skriptdatei für den nächsten Befehl erneut von der Festplatte geöffnet.
1000
Befehle in einem Skript würden 1000
Festplattenoperationen (Öffnen-Lesen-Schließen) für dieselbe Datei bedeuten. Der Genauigkeit halber erzähle ich nicht vonLinienaber überBefehle
Das istwahre Quelle der Langsamkeit beider BAT
und CMD
Skripte.
Zum Beweis: Führen Sie ein einfaches Beispielskript ausignorierendHinweis zum Löschen der Datei; das Skript würde type
selbst:
==> 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"
Führen Sie das obige Skript ausBeobachtenHinweis zum Löschen der Datei; The batch file cannot be found
der Fehler zeigt, dass der Batch-Parser den nächsten echo
Befehl nicht abrufen kann:
==> 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.
Der Vollständigkeit halber hier eine Standardfehlermeldung des Dateisystems:
==> type 725431.cmd
The system cannot find the file specified.
Im Gegenteil, ähnliche (zum Beispiel) PowerShell
Skripte werden im Speicher zwischengespeichert. Führen Sie das Beispielskript erneut ausignorierendTipp, zuerst die Datei zu löschen. Das Skript würde type
Folgendes tun:
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
Ausführen des SkriptsBeobachtenHinweis zum Löschen der Datei. Dadurch würde angezeigt, dass letztere echo
und Get-Content
im Speicher zwischengespeichert wurden:
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