
Es ist ganz einfach, die Ausgabe in eine Textdatei mit einem umzuleiten >
. Beispiel:
for /l %%n in (1,1,10000) do (echo %%n>>output.txt)
Oder alternativ:
for /l %%n in (1,1,10000) do (call:sub %%n)
exit
:sub
(echo %1)>>output.txt
exit /b
In beiden Fällen wird eine Textdatei mit den Zahlen 1 bis 10.000 erstellt.
Bei diesen Beispielen wird jedoch jede Ausgabezeile einzeln auf die Festplatte geschrieben, und mir gefällt der Gedanke nicht, dass bei jeder Ausführung dieser Batchdateien 10.000 einzelne Schreibvorgänge auf meine SSD erfolgen müssen.
Gibt es also eine Möglichkeit, die von einer Operation generierte Ausgabe während ihrer Ausführung in den Speicher zu stellen und die gesamte Ausgabe am Ende in einem Schreibvorgang auf die Festplatte zu schreiben? Irgendeinen erweiterten Umleitungstrick? Oder vielleicht eine Möglichkeit, die laufende Ausgabe in einer Variablen zu speichern, um sie später mit echo umzuleiten %output%>>output.txt
?
Notiz: Das Obige sind nur Beispiele, es besteht keine Notwendigkeit, alternative Methoden zum Erstellen nummerierter Listen vorzuschlagen! Meine Anfrage ist allgemeiner Natur und betrifft die Umleitung der Ausgabe in eine Textdatei, während zeilenweises Schreiben auf die Festplatte vermieden wird.
Antwort1
Gibt es also eine Möglichkeit, die von einer Operation generierte Ausgabe während ihrer Ausführung in den Speicher zu stellen und die gesamte Ausgabe am Ende in einem Schreibvorgang auf die Festplatte zu schreiben? Irgendeinen erweiterten Umleitungstrick? Oder vielleicht eine Möglichkeit, die laufende Ausgabe in einer Variablen zu speichern, um sie später mit echo %output%>>output.txt umzuleiten?
Ja, auf jeden Fall. Verwenden Sie Powershell.
Das Schöne an Powershell ist, dass Sie alles in eine Variable, ein Array oder ein Wörterbuch schreiben und es dann am Ende mit einem einzigen Schreibvorgang vollständig auf die Festplatte schreiben können.
Hier ist ein Beispiel:
meinscript.ps1:
# create the output variable that we'll write to disk later.
$output = @()
1..10000|foreach-object {
#get the number: (this line is optional, but just to make it easier to understand)
$number = $_
#add the number to the output
$output += $number
}
#print the output to the screen:
$output
#write the output to a file:
$output|out-file -FilePath "output.txt"
Sie können natürlich die gesamte Zahlensache ersetzen. Alles, was Sie wissen müssen, ist Folgendes:
# create the variable:
$output = @()
# Add to it
$output += "something"
# Write it to disk:
$output|out-file -FilePath "output.txt"
Antwort2
Probier's einfach:
@echo off & cd /d "%~dp0"
>.\log.txt =;(
for /l %%L in (1,1,10000)do echo/%%~L
);=
Notiz:Die oben genannten Beispiele sind nur Beispiele. Es besteht keine Notwendigkeit, alternative Methoden zum Erstellen nummerierter Listen vorzuschlagen! Meine Anfrage ist allgemeiner Natur und betrifft die Umleitung der Ausgabe in eine Textdatei, wobei zeilenweises Schreiben auf die Festplatte vermieden werden soll.
>redirect_file (
use command blocks
)
Um Ihre Ergebnisse vollständig von der Ausführung Ihres Bats abzuleiten, können Sie ihn auch ausführen und diese Ausführung in eine endgültige Datei umleiten, wobei ein erster Aufruf prüft, ob eine Datei übergeben wurde. Wenn nicht, führt der Bat einen zweiten Aufruf an sich selbst aus und leitet sein Ergebnis dieses Mal in eine Datei um, etwa so:
@echo off && setlocal enableextensions
rem :: checks if the variable has received value ::
if /i "!_log!/" == "/" (
echo/Batch call started: !date! - / - !time!
rem :: If it has not received any value, it will assign and call the bat itself
set "_log="%temp%\log_bat.log"" && echo/>!_log! & "%~0" >>!_log! & exit /b
rem :: As soon as it has received some value, the bat will continue executing, already saving in: !_log!
) else endlocal
:: your current code in bat starts at that point saving the outputs in "%temp%\log_bat.log” ::
...