나는 WIM이 진행 적용 추적 할 수있는 스크립트를 작성하려고 해요 - 지금까지, 나는이 WIMGAPI 래퍼 예제를 활용하여 왔습니다을 :.NET과 Powershell에서 콜백이 다른 결과를 표시하는 이유는 무엇입니까?
Add-Type -Path "Microsoft.Wim.dll"
# Open a handle to the .wim file
$wimHandle = [Microsoft.Wim.WimgApi]::CreateFile("G:\sources\boot.wim", `
[Microsoft.Wim.WimFileAccess]::Read,[Microsoft.Wim.WimCreationDisposition]::OpenExisting, `
[Microsoft.Wim.WimCreateFileOptions]::None, [Microsoft.Wim.WimCompressionType]::None)
# Always set temporary path
[Microsoft.Wim.WimgApi]::SetTemporaryPath($wimHandle, $env:temp) | Out-Null
# Build & register a callback method for actions which are performed by WIMGAPI for this .wim file
$callback = [Microsoft.Wim.WimMessageCallback]{
param (
[Microsoft.Wim.WimMessageType] $messageType,
[System.Object] $message,
[System.Object] $userData
)
if($messageType -eq [Microsoft.Wim.WimMessageType]::Progress)
{
$progressMessage = ($message -as [Microsoft.Wim.WimMessageProgress])
Write-Host "Percent Complete: $($progressMessage.PercentComplete)"
}
return [Microsoft.Wim.WimMessageResult]::Success
}
[Microsoft.Wim.WimgApi]::RegisterMessageCallback($wimHandle, $callback) | Out-Null
try
{
# Get a handle to the first image in the .wim file
$imageHandle = [Microsoft.Wim.WimgAPI]::LoadImage($wimHandle, 1)
# Apply the contents to C:\Apply
[Microsoft.Wim.WimgApi]::ApplyImage($imageHandle, "C:\Apply", [Microsoft.Wim.WimApplyImageOptions]::None)
Read-Host
}
catch
{
Write-Host $_.Exception
}
finally
{
[Microsoft.Wim.WimgApi]::UnregisterMessageCallback($wimHandle, $callback) | Out-Null
}
코드는 성공적으로 실행하고, WIM이 적용됩니다,하지만 불행히도 나는 단지과 같이 두 번 실행 콜백을보고 있어요 :
는 C# 응용 프로그램을 실행할 때, 나는 0에서 모든 백분율 값을 참조 비록Percent Complete: 0
Percent Complete: 100
100.
사실, ApplyImage가 블로킹 호출이고 콜백을 실행하지 못하도록 차단할 수 있다고 생각합니다. 그러나이 문제를 해결할 방법이 없다고 생각합니다.
모든 의견을 크게 기뻐할 것입니다. 감사!
해결 했습니까? – Dennis
불행히도 나는하지 않았다. 코드는 동일하지만 여전히 일치하지 않는 결과가 나타납니다. Powershell에는 실제로 쓰레딩의 개념이 없다는 사실과 관련이 있다고 생각합니다. – slashp
답장을 보내 주셔서 감사합니다. 그것은 작동하지 않는 것은 불행한 일입니다. WIM 이미지를 적용하는 데 몇 분이 걸리므로이 작업을 수행하는 것이 좋을 것처럼 깊숙이 파고들 것입니다. – Dennis