전체 출력을 텍스트 파일로 리디렉션하기 전에 배치 파일 작업이 완료될 때까지 기다리는 방법은 무엇입니까?

전체 출력을 텍스트 파일로 리디렉션하기 전에 배치 파일 작업이 완료될 때까지 기다리는 방법은 무엇입니까?

. >​예를 들어:

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” ::

...

관련 정보