반응형

저는 테스트 환경을 구성할 , 미리 sysprep 구성한 가상 디스크(vhdx)파일을 복사하여 사용합니다.

이렇게 만들어 놓으면, 반복적으로 Windows OS 설치할 필요가 없습니다. 복사하는 단순 작업을 ChatGPT 이용하여 Script 제작해 보도록 하겠습니다.

 

아래의 경로의 가상디스크(vhdx)파일을 지정하는 스크립트 생성

 

ChatGPT 아래와 같이 질문하였습니다.

"F:\sysprepVHD" 의 하위 폴더들은 각각의 vhdx 파일을 포함한 폴더들입니다. 그 안에 있는 VHD 파일을 선택을 Drop down하는 방식으로 선택하는 변수를 만들고 싶습니다. 파워쉘 스크립트로 만들어주세요.

아래의 스크립트를 실행해 봅니다.

$VHDXFolders = Get-ChildItem -Path "F:\sysprepVHD" -Directory
$VHDXFiles = @()

foreach ($Folder in $VHDXFolders) {
    $VHDXFiles += Get-ChildItem -Path $Folder.FullName -Filter *.vhdx
}

$VHDXFileNames = @()
foreach ($File in $VHDXFiles) {
    $VHDXFileNames += $File.Name
}

$VHDXFileNames | Out-GridView -Title "Select a VHDX file" -OutputMode Single

VHDX 선택하는 Script 생성되었습니다.

 

ChatGPT 아래와 같이 추가 질문하였습니다.

위 스크립트에서 선택된 VHDX 파일을 내가 원하는 새 폴더를 GUI 방식으로 생성한 뒤, 해당경로에 복사하는 스크립트를 만들어주세요.

스크립트를 병합해야 하기 때문에 아래와 같이 추가 질문을 하였습니다.

위에 생성된 스크립트들을 병합해주세요.

 

생성된 아래의 스크립트를 실행

$VHDXFolders = Get-ChildItem -Path "F:\sysprepVHD" -Directory
$VHDXFiles = @()

foreach ($Folder in $VHDXFolders) {
    $VHDXFiles += Get-ChildItem -Path $Folder.FullName -Filter *.vhdx
}

$VHDXFileNames = @()
foreach ($File in $VHDXFiles) {
    $VHDXFileNames += $File.Name
}

$SelectedFile = $VHDXFileNames | Out-GridView -Title "Select a VHDX file" -OutputMode Single
$SelectedFilePath = ($VHDXFiles | Where-Object { $_.Name -eq $SelectedFile }).FullName

$NewFolder = New-Item -ItemType Directory -Path (Read-Host "Enter the path of the new folder")

Copy-Item -Path $SelectedFilePath -Destination $NewFolder.FullName

Windows Server 2019 Sysprep 지정

 

경로를 타이핑으로 지정하라고 나옵니다. -> 입력

 

복사는 완료되었습니다.

 

다만 여기서 아쉬운 부분이 경로를 Windows 창에서 만들듯이 하고 싶었고, 복사하는 진행률이 보이지 않았습니다. 이 부분에 대한 수정 가능한지 질문 하였습니다.

위 스크립트에서 대상 폴더를 생성할 때 타이핑이 아니라 마우스로 클릭해서 만들고 싶어. 그리고 복사하는 동안에 진행률이 표시되었으면 좋겠습니다.

$VHDXFolders = Get-ChildItem -Path "F:\sysprepVHD" -Directory
$VHDXFiles = @()

foreach ($Folder in $VHDXFolders) {
    $VHDXFiles += Get-ChildItem -Path $Folder.FullName -Filter *.vhdx
}

$VHDXFileNames = @()
foreach ($File in $VHDXFiles) {
    $VHDXFileNames += $File.Name
}

$SelectedFile = $VHDXFileNames | Out-GridView -Title "Select a VHDX file" -OutputMode Single
$SelectedFilePath = ($VHDXFiles | Where-Object { $_.Name -eq $SelectedFile }).FullName

$NewFolder = New-Item -ItemType Directory -Path (Get-ChildItem (Get-Location) | Out-GridView -Title "Select the destination folder" -OutputMode Single).FullName

$Copy = [System.IO.File]::Copy($SelectedFilePath, "$NewFolder\$SelectedFile")
$Copy.BeginGetProgress(
    [System.AsyncCallback]{
        param ($ar)
        $result = $ar.AsyncState
        while (!$result.IsCompleted) {
            Write-Progress -Activity "Copying $SelectedFile" -PercentComplete ($result.Current / $result.Total) * 100
            Start-Sleep -Milliseconds 100
        }
    }, 
    $Copy)

이전 스크립트와 달리 아래와 같이 GUI 창으로 호출되어 생성이 진행됩니다.

아래의 명령어로 진행된 것으로 보입니다.

$NewFolder = Invoke-Item -Path (New-Object System.Windows.Forms.FolderBrowserDialog).ShowDialog()

 

그런데 아래와 같이 오류가 발생하였습니다.

 

그래서 오류 메시지에 대해서 질문하였습니다.

 

그리고는 재작성을 요청하였습니다.

$VHDXFolders = Get-ChildItem -Path "F:\sysprepVHD" -Directory
$VHDXFiles = @()

foreach ($Folder in $VHDXFolders) {
    $VHDXFiles += Get-ChildItem -Path $Folder.FullName -Filter *.vhdx
}

$VHDXFileNames = @()
foreach ($File in $VHDXFiles) {
    $VHDXFileNames += $File.Name
}

$SelectedFile = $VHDXFileNames | Out-GridView -Title "Select a VHDX file" -OutputMode Single
$SelectedFilePath = ($VHDXFiles | Where-Object { $_.Name -eq $SelectedFile }).FullName

$FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
if ($FolderBrowser.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {
    $NewFolder = $FolderBrowser.SelectedPath
}

$CopyProgress = 0
$CopyTotal = (Get-Item $SelectedFilePath).Length
$CopyBlock = 1048576

Write-Progress -Activity "Copying VHDX file" -PercentComplete $CopyProgress -Status "Starting copy..."

$BytesCopied = 0
$Stopwatch = [System.Diagnostics.Stopwatch]::StartNew()

Get-ChildItem $SelectedFilePath -Recurse | Foreach-Object {
    Copy-Item $_.FullName -Destination $NewFolder.FullName -Passthru | Foreach-Object {
        $BytesCopied += $_.Length
        $CopyProgress = [Math]::Round(($BytesCopied / $CopyTotal) * 100, 2)

        if ($Stopwatch.ElapsedMilliseconds -gt 500) {
            Write-Progress -Activity "Copying VHDX file" -PercentComplete $CopyProgress -Status "$CopyProgress % complete"
            $Stopwatch.Restart()
        }
    }
}

Write-Progress -Activity "Copying VHDX file" -PercentComplete 100 -Status "Copy complete."

 

진행률이 표시됩니다.

 

그런데 복사가 되지 않았습니다.

 

다시 질문하였습니다.

 

그리고 다시 반영을 요청 -> 그러나 계속 자잘한 이상 동작이 발생하여 계속 어떠한 문제점이 있는지를 지적하면서 스크립트를 수정하는 과정을 진행하였습니다.

스크립트라는 것이 어느 단계에 이르면, 결국 사람이 확인하고 수정해야 하는 부분이 발생합니다.

현재까지 진행과정을 보면, 타이핑 -> GUI 동작을 바꾸면서 문제가 많이 발생하였습니다.

 

경로를 타이핑 하는 스크립트를 통해서 다시 분석해 보기로 하였습니다.

$VHDXFolders = Get-ChildItem -Path "F:\sysprepVHD" -Directory
$VHDXFiles = @()

foreach ($Folder in $VHDXFolders) {
    $VHDXFiles += Get-ChildItem -Path $Folder.FullName -Filter *.vhdx
}

$VHDXFileNames = @()
foreach ($File in $VHDXFiles) {
    $VHDXFileNames += $File.Name
}

$SelectedFile = $VHDXFileNames | Out-GridView -Title "Select a VHDX file" -OutputMode Single
$SelectedFilePath = ($VHDXFiles | Where-Object { $_.Name -eq $SelectedFile }).FullName

$NewFolder = New-Item -ItemType Directory -Path (Read-Host "Enter the path of the new folder")

Copy-Item -Path $SelectedFilePath -Destination $NewFolder.FullName

 

한글로 분석을 요청하면, 아래와 같이 끊어지는 것으로 확인됩니다.

그래서 가능하면 영어로 문의하는 것이 조금 좋은 결과로 나오게 됩니다.

 

그래서 지금부터는 영어로 질문하여 진행해 보겠습니다. 방금 분석한 스크립트에서 진행률만 표시되도록 스크립트를 수정해 달라고 요청하였습니다.

-> Write-Progress 추가하여 수정했다고 설명하고 있습니다.

$VHDXFolders = Get-ChildItem -Path "F:\sysprepVHD" -Directory
$VHDXFiles = @()

foreach ($Folder in $VHDXFolders) {
    $VHDXFiles += Get-ChildItem -Path $Folder.FullName -Filter *.vhdx
}

$VHDXFileNames = @()
foreach ($File in $VHDXFiles) {
    $VHDXFileNames += $File.Name
}

$SelectedFile = $VHDXFileNames | Out-GridView -Title "Select a VHDX file" -OutputMode Single
$SelectedFilePath = ($VHDXFiles | Where-Object { $_.Name -eq $SelectedFile }).FullName

$NewFolder = New-Item -ItemType Directory -Path (Read-Host "Enter the path of the new folder")

$totalBytes = (Get-Item $SelectedFilePath).Length
$totalBytesCopied = 0

$copyOperation = {
    param($inputStream, $outputStream)
    while (($read = $inputStream.Read($buffer, 0, $buffer.Length)) -gt 0) {
        $outputStream.Write($buffer, 0, $read)
        $totalBytesCopied += $read
        Write-Progress -Activity "Copying $SelectedFile" -PercentComplete ([int](100 * $totalBytesCopied / $totalBytes))
    }
}

$null = $copyOperation.BeginInvoke($SelectedFilePath, $NewFolder.FullName, $null, $null)

경로입력시 다음과 같이 오류 발생

 

아래와 같이 질문으로 수정 시도

기존에 생성한 경로를 지우지 않고 진행하다 보니 다음과 같이 오류가 발생하였습니다.

 

위 스크립트에서 폴더가 이미 있는 경우에는 다음과 같은 오류가 발생합니다. "New-Item : An item with the specified name D:\wingtiptoys.kr already exists." 폴더가 이미 존재하는 경우에는 생성하지 말고 진행해주세요.

 

-> Test-Path cmdlet 추가하여 해당 폴더가 존재하는지 여부가 추가되었습니다.

 

경로 지정 오류 발생

The error message you're encountering is because the Copy-Item cmdlet in PowerShell version 5.1 (which is the version included in Windows 7 and Windows Server 2008 R2) does not have the -Progress parameter. In order to display the progress of the file copy operation in PowerShell 5.1, you can use the Write-Progress cmdlet inside a loop that copies the file in chunks. Here's the modified script:


표시되는 오류 메시지는 PowerShell 버전 5.1(Windows 7 및 Windows Server 2008 R2에 포함된 버전)의 Copy-Item cmdlet에 -Progress 매개 변수가 없기 때문에 발생합니다. PowerShell 5.1에서 파일 복사 작업의 진행률을 표시하려면 청크로 파일을 복사하는 루프 내에서 Write-Progress cmdlet을 사용할 수 있습니다. 수정된 스크립트는 다음과 같습니다.

-> 분석이 탁월합니다...

 

아래의 스크립트 진행

$VHDXFolders = Get-ChildItem -Path "F:\sysprepVHD" -Directory
$VHDXFiles = @()

foreach ($Folder in $VHDXFolders) {
    $VHDXFiles += Get-ChildItem -Path $Folder.FullName -Filter *.vhdx
}

$VHDXFileNames = @()
foreach ($File in $VHDXFiles) {
    $VHDXFileNames += $File.Name
}

$SelectedFile = $VHDXFileNames | Out-GridView -Title "Select a VHDX file" -OutputMode Single
$SelectedFilePath = ($VHDXFiles | Where-Object { $_.Name -eq $SelectedFile }).FullName

$NewFolderPath = Read-Host "Enter the path of the new folder"

if (!(Test-Path $NewFolderPath)) {
    New-Item -ItemType Directory -Path $NewFolderPath
}

$BufferSize = 1024 * 1024
$Buffer = New-Object byte[] $BufferSize
$SourceStream = [System.IO.File]::OpenRead($SelectedFilePath)
$DestinationStream = [System.IO.File]::Create($NewFolderPath + "\" + $SelectedFile)
$BytesRead = 0
$TotalBytes = [System.Math]::Min($SourceStream.Length, [System.Int64]::MaxValue)
$BytesCopied = 0

while (($BytesRead = $SourceStream.Read($Buffer, 0, $BufferSize)) -gt 0) {
    $DestinationStream.Write($Buffer, 0, $BytesRead)
    $BytesCopied += $BytesRead
    Write-Progress -Activity "Copying $SelectedFile" -PercentComplete ([System.Int32](100 * $BytesCopied / $TotalBytes))
}

$SourceStream.Close()
$DestinationStream.Close()

이상 문제 없이 진행되는 것을 확인할 있었습니다.

 

여기서 조금 욕심을 내어서 복사되는 경로의 VHDX 파일의 이름을 지정하고 싶었습니다.

In this script, a new variable $NewFileName is added to store the new name for the VHDX file. The user is prompted to enter the new name for the file using the Read-Host cmdlet. The destination file path is then constructed using the $NewFolderPath and $NewFileName variables, so that the file is copied with the new name.

이 스크립트에서 VHDX 파일의 새 이름을 저장하기 위해 새 변수 $NewFileName이 추가되었습니다. 사용자에게 Read-Host cmdlet을 사용하여 파일의 새 이름을 입력하라는 메시지가 표시됩니다. 그러면 파일이 새 이름으로 복사되도록 $NewFolderPath 및 $NewFileName 변수를 사용하여 대상 파일 경로가 생성됩니다.
$VHDXFolders = Get-ChildItem -Path "F:\sysprepVHD" -Directory
$VHDXFiles = @()

foreach ($Folder in $VHDXFolders) {
    $VHDXFiles += Get-ChildItem -Path $Folder.FullName -Filter *.vhdx
}

$VHDXFileNames = @()
foreach ($File in $VHDXFiles) {
    $VHDXFileNames += $File.Name
}

$SelectedFile = $VHDXFileNames | Out-GridView -Title "Select a VHDX file" -OutputMode Single
$SelectedFilePath = ($VHDXFiles | Where-Object { $_.Name -eq $SelectedFile }).FullName

$NewFolderPath = Read-Host "Enter the path of the new folder"
$NewFileName = Read-Host "Enter the new name for the VHDX file"

if (!(Test-Path $NewFolderPath)) {
    New-Item -ItemType Directory -Path $NewFolderPath
}

$BufferSize = 1024 * 1024
$Buffer = New-Object byte[] $BufferSize
$SourceStream = [System.IO.File]::OpenRead($SelectedFilePath)
$DestinationStream = [System.IO.File]::Create($NewFolderPath + "\" + $NewFileName)
$BytesRead = 0
$TotalBytes = [System.Math]::Min($SourceStream.Length, [System.Int64]::MaxValue)
$BytesCopied = 0

while (($BytesRead = $SourceStream.Read($Buffer, 0, $BufferSize)) -gt 0) {
    $DestinationStream.Write($Buffer, 0, $BytesRead)
    $BytesCopied += $BytesRead
    Write-Progress -Activity "Copying $SelectedFile" -PercentComplete ([System.Int32](100 * $BytesCopied / $TotalBytes))
}

$SourceStream.Close()
$DestinationStream.Close()

아래와 같이 파일 이름을 지정하였습니다.

 

아래와 같이 확장자가 없이 복사 되었습니다.

 

확장자는 자동으로 지정하도록 수정 요청

스크립트 실행

$VHDXFolders = Get-ChildItem -Path "F:\sysprepVHD" -Directory
$VHDXFiles = @()

foreach ($Folder in $VHDXFolders) {
    $VHDXFiles += Get-ChildItem -Path $Folder.FullName -Filter *.vhdx
}

$VHDXFileNames = @()
foreach ($File in $VHDXFiles) {
    $VHDXFileNames += $File.Name
}

$SelectedFile = $VHDXFileNames | Out-GridView -Title "Select a VHDX file" -OutputMode Single
$SelectedFilePath = ($VHDXFiles | Where-Object { $_.Name -eq $SelectedFile }).FullName

$NewFolderPath = Read-Host "Enter the path of the new folder"
$NewFileName = Read-Host "Enter the new name for the VHDX file"
$NewFileName = $NewFileName + ".vhdx"

if (!(Test-Path $NewFolderPath)) {
    New-Item -ItemType Directory -Path $NewFolderPath
}

$BufferSize = 1024 * 1024
$Buffer = New-Object byte[] $BufferSize
$SourceStream = [System.IO.File]::OpenRead($SelectedFilePath)
$DestinationStream = [System.IO.File]::Create($NewFolderPath + "\" + $NewFileName)
$BytesRead = 0
$TotalBytes = [System.Math]::Min($SourceStream.Length, [System.Int64]::MaxValue)
$BytesCopied = 0

while (($BytesRead = $SourceStream.Read($Buffer, 0, $BufferSize)) -gt 0) {
    $DestinationStream.Write($Buffer, 0, $BytesRead)
    $BytesCopied += $BytesRead
    Write-Progress -Activity "Copying $SelectedFile" -PercentComplete ([System.Int32](100 * $BytesCopied / $TotalBytes))
}

$SourceStream.Close()
$DestinationStream.Close()

아래와 같이 의도한 대로 결과가 나왔습니다.

 

이제 마지막으로 타이핑 없이 Windows 창으로 지정해서 대상 폴더 파일명을 선택하여 지정하도록 요청해보겠습니다. Windows 창을 GUI Dialogbox라고 부르는 같습니다.

최종적으로 아래의 스크립트를 알려주었습니다.

$VHDXFolders = Get-ChildItem -Path "F:\sysprepVHD" -Directory
$VHDXFiles = @()

foreach ($Folder in $VHDXFolders) {
    $VHDXFiles += Get-ChildItem -Path $Folder.FullName -Filter *.vhdx
}

$VHDXFileNames = @()
foreach ($File in $VHDXFiles) {
    $VHDXFileNames += $File.Name
}

$SelectedFile = $VHDXFileNames | Out-GridView -Title "Select a VHDX file" -OutputMode Single
$SelectedFilePath = ($VHDXFiles | Where-Object { $_.Name -eq $SelectedFile }).FullName

$SaveFileDialog = New-Object System.Windows.Forms.SaveFileDialog
$SaveFileDialog.InitialDirectory = [Environment]::GetFolderPath("Desktop")
$SaveFileDialog.Filter = "VHDX files (*.vhdx)|*.vhdx"
$SaveFileDialog.FileName = $SelectedFile

if ($SaveFileDialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {
    $NewFolderPath = [System.IO.Path]::GetDirectoryName($SaveFileDialog.FileName)
    $NewFileName = [System.IO.Path]::GetFileName($SaveFileDialog.FileName)
    
    if (!(Test-Path $NewFolderPath)) {
        New-Item -ItemType Directory -Path $NewFolderPath
    }
    
    $BufferSize = 1024 * 1024
    $Buffer = New-Object byte[] $BufferSize
    $SourceStream = [System.IO.File]::OpenRead($SelectedFilePath)
    $DestinationStream = [System.IO.File]::Create($NewFolderPath + "\" + $NewFileName)
    $BytesRead = 0
    $TotalBytes = [System.Math]::Min($SourceStream.Length, [System.Int64]::MaxValue)
    $BytesCopied = 0
    
    while (($BytesRead = $SourceStream.Read($Buffer, 0, $BufferSize)) -gt 0) {
        $DestinationStream.Write($Buffer, 0, $BytesRead)
        $BytesCopied += $BytesRead
        Write-Progress -Activity "Copying $SelectedFile" -PercentComplete ([System.Int32](100 * $BytesCopied / $TotalBytes))
    }
    
    $SourceStream.Close()
    $DestinationStream.Close()
}

 

실행시 경로 파일명 지정이 가능하고, 복사도 정상적으로 진행되었습니다.

내용에 대한 정리가 필요할 같아서 Comment 요청하였습니다.

 

아래와 같이 스크립트 내용에 대해서 정리해 주었습니다.

 

그리고 스크립트 정리를 요청하였습니다. 다만 내용이 길기 때문에 중간에 끊어지는 것으로 확인됩니다. 아래와 같이 3 질문하였습니다.

Please modify the contents of the above Comment by leaving it as a comment in the script.


The explanation below seems to have been cut off from the answers above. Please provide further explanation.
    while (($BytesRead = $SourceStream.Read($Buffer, 0, $BufferSize)) -gt 0) {
        $DestinationStream.Write($Buffer, 0, $BytesRead)
        $BytesCopied += $BytesRead
        Write-Progress -Activity "Copying $SelectedFile" -PercentComplete ([System.Int32](100 * $BytesCopied / $TotalBytes))
    }
   
    $SourceStream.Close()
    $DestinationStream.Close()
}


Please explain in comments on the script, including what you just answered

 

그리고 내용들을 병합하면 아래의 스크립트가 완성됩니다.

# This line gets all subdirectories in the folder "F:\sysprepVHD" and stores the results in the $VHDXFolders variable
$VHDXFolders = Get-ChildItem -Path "F:\sysprepVHD" -Directory
# This line creates an empty array to store the vhdx files
$VHDXFiles = @()

# This loop goes through each subdirectory in $VHDXFolders and adds all vhdx files in each folder to the $VHDXFiles array
foreach ($Folder in $VHDXFolders) {
    $VHDXFiles += Get-ChildItem -Path $Folder.FullName -Filter *.vhdx
}

# This line creates an empty array to store the names of the vhdx files
$VHDXFileNames = @()
# This loop goes through each file in $VHDXFiles and adds the name of each file to the $VHDXFileNames array
foreach ($File in $VHDXFiles) {
    $VHDXFileNames += $File.Name
}

# This line opens an Out-GridView window to display the names of the vhdx files in $VHDXFileNames, and allows the user to select one file. The selected file name is stored in the $SelectedFile variable.
$SelectedFile = $VHDXFileNames | Out-GridView -Title "Select a VHDX file" -OutputMode Single
# This line finds the full path of the selected file based on its name and stores it in the $SelectedFilePath variable
$SelectedFilePath = ($VHDXFiles | Where-Object { $_.Name -eq $SelectedFile }).FullName

# This line creates a SaveFileDialog object to allow the user to choose the location and name of the copied file
$SaveFileDialog = New-Object System.Windows.Forms.SaveFileDialog
# This line sets the default directory for the SaveFileDialog to the user's desktop
$SaveFileDialog.InitialDirectory = [Environment]::GetFolderPath("Desktop")
# This line sets the file type filter for the SaveFileDialog to only show vhdx files
$SaveFileDialog.Filter = "VHDX files (*.vhdx)|*.vhdx"
# This line sets the default file name for the SaveFileDialog to the selected file name
$SaveFileDialog.FileName = $SelectedFile

# This line checks if the user clicked the "OK" button in the SaveFileDialog
if ($SaveFileDialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {
    # This line gets the directory path of the selected save location and stores it in the $NewFolderPath variable
    $NewFolderPath = [System.IO.Path]::GetDirectoryName($SaveFileDialog.FileName)
    # This line gets the file name of the selected save location and stores it in the $NewFileName variable
    $NewFileName = [System.IO.Path]::GetFileName($SaveFileDialog.FileName)
    
    # This line checks if the directory in the selected save location does not exist
    if (!(Test-Path $NewFolderPath)) {
        # This line creates the directory in the selected save location if it does not exist
        New-Item -ItemType Directory -Path $NewFolderPath
  
$BufferSize = 1024 * 1024
# This line creates a byte array of the buffer size for reading the source file
$Buffer = New-Object byte[] $BufferSize
# This line opens the source file for reading and stores the result in the $SourceStream variable
$SourceStream = [System.IO.File]::OpenRead($SelectedFilePath)
# This line creates the destination file and stores the result in the $DestinationStream variable
$DestinationStream = [System.IO.File]::Create($NewFolderPath + "\" + $NewFileName)
# This line initializes the $BytesRead variable to 0
$BytesRead = 0
# This line sets the $TotalBytes variable to the minimum of the source file length and the maximum value of a 64-bit integer
$TotalBytes = [System.Math]::Min($SourceStream.Length, [System.Int64]::MaxValue)
# This line initializes the $BytesCopied variable to 0
$BytesCopied = 0

# This loop reads and writes the file in the buffer size chunks until all bytes have been read from the source file
while (($BytesRead = $SourceStream.Read($Buffer, 0, $BufferSize)) -gt 0) {
    # This line writes the bytes from the buffer to the destination file
    $DestinationStream.Write($Buffer, 0, $BytesRead)
    # This line updates the $BytesCopied variable with the number of bytes written to the destination file
    $BytesCopied += $BytesRead
    # This line displays a Write-Progress bar to show the progress of the file copy
    Write-Progress -Activity "Copying $SelectedFile" -PercentComplete ([System.Int32](100 * $BytesCopied / $TotalBytes))
}

# This line closes the source file
$SourceStream.Close()
# This line closes the destination file
$DestinationStream.Close()
}

 

다음글

2023.02.12 - [ChatGPT] - ChatGPT. VM을 생성하는 Script 제작

 

반응형

+ Recent posts