
. >
예를 들어:
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의 장점은 모든 것을 변수, 배열 또는 사전에 덤프한 다음 마지막에 단일 쓰기로 전체를 디스크에 쓸 수 있다는 것입니다.
예는 다음과 같습니다.
myscript.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” ::
...