使用 可以很容易地将输出重定向到文本文件>
。例如:
for /l %%n in (1,1,10000) do (echo %%n>>output.txt)
或者:
for /l %%n in (1,1,10000) do (call:sub %%n)
exit
:sub
(echo %1)>>output.txt
exit /b
任何一种方法都会创建一个列出 1 到 10,000 的数字的文本文件。
但是,这些示例会将每行输出单独写入磁盘,并且我不喜欢每次运行这些批处理文件时对我的 SSD 进行 10,000 次单独写入的想法。
那么,我是否可以以某种方式在操作进行时将操作生成的输出排队到内存中,然后在最后将整个输出一次性写入磁盘?一些高级重定向技巧?或者也许某种方法将正在进行的输出存储在变量中,稍后使用 echo 重定向%output%>>output.txt
?
笔记:以上只是示例,无需建议创建编号列表的替代方法!我的查询是一般性的,关于将输出重定向到文本文件,同时避免逐行写入磁盘。
答案1
那么,我是否可以以某种方式在操作进行时将其生成的输出排队到内存中,然后在最后将整个输出一次性写入磁盘?一些高级重定向技巧?或者也许某种方法将正在进行的输出存储在变量中,稍后使用 echo %output%>>output.txt 进行重定向?
是的,当然。使用 powershell。
powershell 的优点在于,您可以将所有内容转储到变量、数组或字典中,然后在最后通过一次写入将其完全写入磁盘。
以下是一个例子:
我的脚本.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"
当然,你可以替换整个数字。你只需要知道这一点:
# create the variable:
$output = @()
# Add to it
$output += "something"
# Write it to disk:
$output|out-file -FilePath "output.txt"
答案2
你试一试:
@echo off & cd /d "%~dp0"
>.\log.txt =;(
for /l %%L in (1,1,10000)do echo/%%~L
);=
笔记:以上只是示例,无需建议创建编号列表的替代方法!我的查询是一般性的,关于将输出重定向到文本文件,同时避免逐行写入磁盘。
>redirect_file (
use command blocks
)
要将结果完全从蝙蝠程序的执行中重定向,您还可以执行它并将此执行重定向到最终文件,其中第一次调用检查是否传递了文件,如果没有,则蝙蝠程序第二次调用自身运行,这次将其结果重定向到文件,如下所示:
@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” ::
...