윈 도 우 PowerShell + (ROBOCOPY with progress bar) + (Total Commander)
2024.07.08 05:37
PowerShell 사용하여 진행률 표시줄이 있는 ROBOCOPY 스크립트를 찿던중 다음과 같은
스크립트를 찿았습니다. (저는 PowerShell 문법 모릅니다)
(진행줄을 볼 수 있는것 중에는 속도도 괜찮고 같은파일 Skip도 확실해 보입니다)
※ 문의내용:
PowerShell 실행파일은 한글이나 영문이나 해시값도 같은 똑같은 파일인데
한글버전에서만 progress bar가 실행이 안되서 script 내용중 어디가 문제인지 문의 드립니다.
문제점:
1. 영문윈도우에서는 progress bar가 잘 보이는데 한글윈도우에서는 진행률 표시줄이 나타나지
않습니다
-한글 윈도우 테스트 버전: 윈도우11_23H2, 윈도우10 21H2 1803 2209 (X)
-영문 윈도우 테스트 버전: 윈도우10 19H2, 20H1, 22H2 (O)
2. [destIndex, length 및 배열의 하한을 확인하십시오]란 메시지가 간혹 보이긴한데
정상적으로 파일복사는 되는것 같습니다.
------------------------------------------------------------------------------------
Receive-Job : 대상 배열의 길이가 짧습니다. destIndex, length 및 배열의 하한을 확인하십시오.
위치 줄:28 문자:13
+ $progress = Receive-Job -Job $robocopyjob -Keep -ErrorAction Silently ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Receive-Job], ArgumentException
+ FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ReceiveJobCommand
------------------------------------------------------------------------------------
※ 스크립트
----- 시작------------------------------------------------------------
$Source = "'$($args[0])'"
# 백업 파일 위치를 설정합니다.
$Destination = "'$($args[1])'"
# 파일이 저장될 위치를 설정합니다.
$robocmd = "robocopy " + $Source + " " + $Destination + " /E /BYTES /mt /XF sync.ffs_db /R:1 /W:1 /DCOPY:DAT /COPYALL"
# robocopy를 사용하여 백업 명령 설정 // / mir copying 사용
$staging = invoke-expression "$robocmd /l"
# 먼저 테스트로 / l 매개변수를 사용하여 명령을 실행합니다 (아직 실제로 백업되지 않음 ).
$ttnewfile=$staging -match 'new file'
$ttmodified = $staging -match 'newer'
$totalfile = $ttnewfile + $ttmodified
# 백업 해야 하는 모든 파일을 $totalfile 변수 에 저장합니다.
$ttBytearray = [System.Collections.ArrayList]@()
foreach ($file in $totalfile)
{
$arrayID = $ttBytearray.add($file.substring(13,13).trim())
# 텍스트를 파일 크기에 맞게 잘라서 $ttBytearray에 저장합니다.
# arrayID 섹션 에서 이 작업을 수행하지 않으면 일련번호 배열이 출력 에 표시됩니다 .
}
$totalByte = (($ttBytearray | measure-object -sum).sum)
# 복사해야 하는 모든 파일의 크기를 결합합니다.
#백업파일 시작
$robocopyjob = Start-Job -Name robocopy -ScriptBlock {param ($command) ; Invoke-Expression -Command $command} -ArgumentList $robocmd
# 상태를 확인하기 위한 작업을 생성하여 데이터 백업을 시작합니다 .
while ($robocopyjob.State -eq 'running')
# 상태를 표시하기 위한 루프 검사
{
$progress = Receive-Job -Job $robocopyjob -Keep -ErrorAction SilentlyContinue
$totolFileCount = $totalfile.count
if ($progress)
{
$copiedfiles = ($progress | Select-String -SimpleMatch 'new file', 'newer')
if ($copiedfiles) # null 값이 있는지 확인합니다 .
{
if ($copiedfiles.count -le 0) { $TotalFilesCopied = $copiedfiles.Count }
else { $TotalFilesCopied = $copiedfiles.Count - 1 }
$FilesRemaining = ($totalfile.count - $TotalFilesCopied)
$Bytesarray = [System.Collections.ArrayList]@()
foreach ($Newfile in $copiedfiles) #count finished copy size
{
if($Newfile)
{
$curCopy = $Bytesarray.add($Newfile.tostring().substring(13, 13).trim())
# $Bytearray 변수 에 복사되는 파일의 크기를 저장합니다 .
}
}
$TotalCopies = (($Bytesarray | measure-object -sum).sum)
# 이미 복사된 파일의 크기를 알아냅니다.
$PercentComplete = (($TotalCopies/$totalByte) * 100)
# 현재 달성한 를 찾습니다.
Write-Progress -Id 1 -Activity "Backup files, $TotalFilesCopied of $totolFileCount " -Status "status" -PercentComplete $PercentComplete
# 백업 상태를 표시하는 진행률 표시줄을 만듭니다 .
}
}
}
Write-Progress -Id 1 -Activity "Copying files from $Source to $Destination" -Status 'Completed' -Completed
# 데이터가 성공적으로 복사되었다는 상태를 보여주는 Create Progress입니다 .
$results = Receive-Job -Job $robocopyjob
# 결과를 검색하여 $result 에 저장합니다.
Remove-Job $robocopyjob
# 생성된 작업을 닫습니다 .
$results[5]
$results[-13..-1]
# 데이터를 검색하고 출력 에 표시하여 처음 5 줄과 마지막 13 줄을 표시합니다 .
$args[0]
# 원본에는 없는 공백있는 폴더명을 보기위해 삽입했습니다.
$args[1]
$Source
$Destination
cmd /c pause | out-null
# 대기 명령 중지
---- 끝-------------------------------------------------------------------
*설명: 공백있는 폴더 처리를 위해 이렇게 했습니다.
$Source = "'$($args[0])'"
# 공백있는 폴더는 위와같이 해야 정상적으로 인식되더군요.
[Total Commander]
명령어: PowerShell %COMMANDER_PATH%\Robocopy_ps\BackupPlan5b_Test.ps1
매개변수: '%P%N' '%T%N'
-BackupPlan5b_Test.ps1 파일명이나 위치는 편하신데 설정하세요.
*참조 원본 사이트
ROBOCOPY with progress bar
https://lazedev.blogspot.com/2019/06/robocopy-with-progress-bar.html
댓글 [5]
-
GreenTea 2024.07.08 08:51
-
지후빠 2024.07.08 10:03
스크립트는 테스트 해보겠습니다.
TC 매개변수는 %P%N %T%N 처럼 따옴표 없이 사용해보십시오.
이 형태는 기본으로 TC에서 쌍따옴표를 양쪽에 붙여줍니다.
그럼 다음도 원본 처럼 둬도 될 것 같구요.
$Source = "$($args[0])"
$Destination = "$($args[1])"
-
YoungSS 2024.07.08 19:53
여러번 테스트하고 에러 안생기게 님 스크립트를 수정해서 올려 놨어요.
님이 코멘트 해놓은거 다 지우고
수정한 부분은 <# #> 로 님코드를 코멘트 처리하고
바로 밑에 제가 수정한걸 넣었어요.
https://github.com/KoanYoung/WindowsForum.KR/blob/main/YoungSS01/PsRobo.ps1
1번 질문:
저 스크립트가 robocopy 실행때 출력되는 문구를 캡쳐하는데,
저부분이 한글판 윈도우에선 한글로 나와서 그런거 같네요.
표시되는 그대로 고쳐보세요.
전 영문판 윈도우라 진짜 그런지 확인은 못해봤습니다.
"new file, newer, running"
$ttnewfile=$staging -match 'new file'
$ttmodified = $staging -match 'newer' ($progress | Select-String -SimpleMatch 'new file', 'newer')
$robocopyjob.State -eq 'running'
2번 질문:
에러원인은 정확히 모르겠지만, 저부분에서 에러가 났다고 뜨는데
이렇게 하면 에러가 안생깁니다. 위 수정한 스크립트 중 한부분입니다.
<# $robocopyjob = Start-Job -Name robocopy -ScriptBlock {param ($command) ; Invoke-Expression -Command $command} -ArgumentList $robocmd #> $robocopyJob = Start-Job -Name Robo1 -scriptBlock { robocopy $using:robocmd } <# while ($robocopyjob.State -eq 'running') { $progress = Receive-Job -Job $robocopyjob -Keep -ErrorAction SilentlyContinue } #> While(($robocopyJob.HasMoreData) -OR ($robocopyJob.State -eq "Running")) { $progress += (Receive-job $robocopyJob) Start-Sleep 1
** 그리고 Progress Bar 부분도 위 캡쳐화면에 표시된 것처럼 이렇게 수정 했어요.
<# Write-Progress -Id 1 -Activity "Backup files, $TotalFilesCopied of $totolFileCount " -Status "status" -PercentComplete $PercentComplete #> Write-Progress -Id 1 -Activity ` "TotalSize [$([Math]::Round($Totalbyte/1GB,2))GB] $TotalFilesCopied / $totolFileCount - $FilesRemaining Remaining $Source >> $Destination " ` -Status "status" -PercentComplete $PercentComplete
-
우리집 2024.07.09 05:06
YoungSS님께서 올려주신 스크립트 한글윈과 영문윈에서 테스트 해보았습니다 (감사드려요..)
(윈도우 버전은 상관 없을것 같긴 한데요.)
한글윈버전: 윈10 22H2_Kor
영문윈버전: 윈10 20H1_ENG
A. 한글윈버전 테스트결과(윈10 22H2_Kor)
1. 모든 상황에서 진행바(progress bar)가 실행되지 않습니다.
2. 공백있는 폴더에서 진행바는 없지만 에러없이 복사완료.
3. ( )있는 폴더는 에러가 보이지만 복사완료(robocopy 자체 에러인것 같네요).
4. [destIndex, length 및 배열의 하한을 확인하십시오]란 메시지는 보이지 않네요.
▽공백없는폴더
▽공백있는폴더
▽괄호()있는폴더1
▽괄호()있는폴더2
B. 영문윈버전 테스트결과(윈10 20H1_ENG)
1. 공백없는 폴더만 진행바(progress bar)가 잘 실행됩니다.(한글이 있어도 글자만 깨져 보이지 잘 됩니다)
2. 공백있는 폴더+괄호( ) 있는 폴더는 에러메시지 보이면서 진행바가 실행되지 않습니다.
(파일은 정상적으로 복사는 됩니다)
3. [destIndex, length 및 배열의 하한을 확인하십시오]란 메시지는 보이지 않네요.
▽공백없는폴더▽공백없는 폴더(skip 결과)
▽공백없는 폴더(한글포함)1
▽공백없는 폴더(한글포함)2
▽공백있는폴더
▽공백있는 폴더+괄호( ) 있는 폴더
▽괄호있는 폴더(robocopy 자체 에러)
- 공백없는폴더.png (11.8KB)(0)
- 공백있는폴더.png (12.5KB)(0)
- 괄호()있는폴더1.png (21.2KB)(0)
- 괄호()있는폴더2.png (20.4KB)(0)
- 공백없는 폴더.png (18.7KB)(0)
- 공백없는 폴더(skip 결과).png (17.1KB)(0)
- 공백없는 폴더(한글포함)1.png (19.0KB)(0)
- 공백없는 폴더(한글포함)2.png (10.2KB)(0)
- 공백있는 폴더.png (71.3KB)(0)
- 공백있는 폴더+괄호( ) 있는 폴더.png (71.9KB)(0)
- 괄호있는 폴더(robocopy 자체 에러).png (72.5KB)(0)
-
우리집 2024.07.09 06:05
한글윈도우에서 progress bar가 실행되는 스크립트입니다.
참고가 될지는 모르겠네요. 아니면 그냥 넘기세요(좀 느리고 skip 할 때도 다시 복사 하듯이 느린 느낌..)
--------------------------------------------------------------------
Robocopy $($source = "$($args[0])"; $source) $([double]$count = (gci $source -file -fo -re).Count; [double]$fLeft = $count; [double]$number = 0; $destination = "$($args[1])";$destination) *.* /E /IS /NJH /NJS /NDL /NC /BYTES /mt /XF sync.ffs_db /R:1 /W:1 /DCOPY:DAT /COPY:DAT | %{
$Script:data = $_ -split '\x09'
If(![String]::IsNullOrEmpty("$($data[4])")){
$Script:file = $data[4] -replace '.+\\(?=(?:.(?!\\))+$)'
$fLeft--
$number++
}
If(![String]::IsNullOrEmpty("$($data[0])")){
$Script:percent = ($data[0] -replace '%') -replace '\s'
}
If(![String]::IsNullOrEmpty("$($data[3])")){
[double]$Script:size = $data[3]
switch ($size) {
{$_ -gt 1TB -and $_ -lt 1024TB} {
[String]$size = ($size / 1TB).ToString("n2") + " TB"
}
{$_ -gt 1GB -and $_ -lt 1024GB} {
[String]$size = ($size / 1GB).ToString("n2") + " GB"
}
{$_ -gt 1MB -and $_ -lt 1024MB} {
[String]$size = ($size / 1MB).ToString("n2") + " MB"
}
{$_ -ge 1KB -and $_ -lt 1024KB} {
[String]$size = ($size / 1KB).ToString("n2") + " KB"
}
{$_ -lt 1KB} {
[String]$size = "$size B"
}
}
}
Write-Progress -Activity " Currently Copying: ..\$file" -CurrentOperation "Total Files: $(($count).ToString()) Copied: $(($number - 1).ToString()) Left: $(($fLeft + 1).ToString())" -Status "Size: $size Complete: $percent%" -PercentComplete "$percent"
}
Write-Progress -Activity " " -Completed
$Source
$Destination
cmd /c pause | out-null
# 대기 명령 중지
-------------------------------------------------------------------------
[Total Commander]
명령어: PowerShell %COMMANDER_PATH%\Robocopy_ps\robo_00.ps1
매개변수: %Q"'%P%N'" %Q"'%T%N'"
*참고 원본 사이트
https://www.reddit.com/r/PowerShell/comments/p4l4fm/better_way_of_robocopy_writeprogress/?rdt=52761
번호 | 제목 | 글쓴이 | 조회 | 등록일 |
---|---|---|---|---|
[공지] | 질문과 답변 게시판 이용간 유의사항 | gooddew | - | - |
100228 | 하드웨어| SSD 상태가 궁금해서 질문드립니다. [4] | 하늘개구 | 529 | 07-10 |
100227 | 소프트웨어| youtube 다운 잘 되시나요? [8] | lyj | 844 | 07-10 |
100226 | 윈 도 우| PE부팅시 DPI설정 100% → 150%로 디폴트 사용하고 싶습니다. [13] | galgod | 434 | 07-10 |
100225 | 윈 도 우| 브라우저가 갑자기 지 멋대로 실행됩니다. [3] | anfy | 571 | 07-09 |
100224 | 윈 도 우| Kb5034441 설치 오류 [2] | 솔모로 | 542 | 07-09 |
100223 | 소프트웨어| 부팅 메시지 삭제하는 방법 문의 [13] | Lepton2 | 588 | 07-09 |
100222 | 윈 도 우| 윈도우 usb외장 부팅 만들기 [7] | 수리수리 | 678 | 07-09 |
100221 | 윈 도 우| PC방 노하드시스템 잘아시는분계신가요? [8] | ARGB | 963 | 07-08 |
100220 | 기 타| 외부에서 데탑의 파일을 보고싶습니다. [10] | 대조선언니 | 660 | 07-08 |
100219 | 기 타| 키보드의 윗 방향 방향키(↑)를 한번 눌러도 쭉 위로 계속... [4] | pinnk | 493 | 07-08 |
100218 | 윈 도 우| 윈도우 프로페셔널이 프로인가요? [4] | WinNTLiteDev | 615 | 07-08 |
100217 | 기 타| 인터넷 지원금 받는 법 문의 [4] | asklee | 599 | 07-08 |
100216 | 윈 도 우| 윈도우10 32비트를 윈도우11로 업데이트 가능할까요? [18] | 프라이멀 | 585 | 07-08 |
100215 | 윈 도 우| 엣지 완전 초기화 [2] | 개골동자 | 766 | 07-08 |
100214 | 하드웨어| 5600 업그레이드중 램슬롯 고장?????? [1] | toto65 | 510 | 07-08 |
» | 윈 도 우| PowerShell + (ROBOCOPY with progress bar) + (Total Comm... [5] | 우리집 | 411 | 07-08 |
100212 | 소프트웨어| 크롬과 엣지 브라우저 각각에서 "즐겨찾기"가 추... [12] | 수학으로의 | 490 | 07-07 |
100211 | 윈 도 우| 윈도우 드라이브명 바꾸기 [3] | 군수과왕고 | 563 | 07-07 |
100210 | 소프트웨어| 실시간 스트리밍 영상을 녹화할만한 유틸은? [2] | 지나다 | 501 | 07-07 |
100209 | 윈 도 우| 윈도우11 업데이트 질문? [3] | 맹물 | 328 | 07-07 |
좋은 팁은 강좌/팁으로 옮겨 주세요.
감사함니다.
본문글 추천기능이 없군요.