私がシーケンスした一部のアプリケーションでは、App-Vはアプリケーションを正しく機能させるために必要なことを実行しているようです。ただし、他のケースでは、ローカルファイルシステムに存在するはずのいくつかのファイルが仮想化されていることがわかりました。これらのファイルは仮想化されたアプリケーションの「修復」に耐えられないため、これは問題です。
VFSフォルダーをマージモードに設定すると、アプリケーションがローカルファイルシステムに書き込むことができると思いました。しかし、簡単なテストでは、これは当てはまらないようであることが明らかになりました。明らかに、VFSではなく、ローカルファイルシステムからの読み取りとローカルファイルシステムへの書き込みを指示するルールが必要です。
ローカルファイルシステムは、App-Vアプリケーションからどのような条件で読み取られたり書き込まれたりしますか?
TL; DR
ローカルファイルシステムに存在するファイルcan対応するVFSフォルダーが「マージ」モードの場合、仮想化アプリケーションによって表示されますor対応するフォルダーはVFSに記載されていません。ただし、対応するVFSフォルダーが「オーバーライド」モードの場合、同じファイルcannotが表示されます。
仮想化アプリケーションは、次の両方が当てはまる場合にのみローカルファイルシステムに書き込みます。
この質問に答えるための信頼できるドキュメントを見つけることができませんでした。私が見つけた最も近い情報は KalleSaunamäkiの2011年のブログ投稿 App-V4.6についてでした。その投稿は周辺のオンポイントだけであるだけでなく、App-V 5.xの動作も少なくとも1つのケースで変更されているようです(つまり、App-V 5.xは欠落したマージを作成していないようです-ローカルファイルシステム上のモードVFSフォルダーはもうありませんが、Kalleは4.6を目撃したようです)。
私の大雑把な実験は混乱を招く結果をもたらしたので、これを理解するためにいくつかのより正式なテストを実行することにしました。
テストでは、次の各段階でファイルを作成しました。
シーケンスの終了時にVFSがフォルダーにどのように適用されるかについては、次の3つのケースが考えられます。
公開段階では、ローカルファイルシステムと仮想ファイルシステムのそれぞれに任意のフォルダを作成することも作成しないこともできます。それは4つの可能性です。
VFSを適用する3つの方法と、4つの公開の可能性を組み合わせると、12のケースでテストしました。私はこれを自動化し、(うまくいけば)間違いを避けるためにいくつかのスクリプトを使用しました。これらのスクリプトは、この投稿の最後にあります。
シーケンサーUIから見たVFSは次のとおりです。
公開されたアプリのバブルの内側と外側の両方から、スクリプトによって書き込まれた各ファイルの存在を確認しました。結果は次の表にあります。
表に基づくと、次のステートメントが成り立つように見えます。
$splat = @{
Cases = 4..11
FolderName = 'ExistsBeforeSequencing'
FileName = 'ExistsBeforeSequencing'
Mode = 'Create'
}
.\Alter-Folders.ps1 @splat
$splats = @(
@{
Cases = 0..3
FolderName = 'CreatedDuringSequencing'
FileName = 'CreatedDuringSequencing'
Mode = 'Create'
},
@{
Cases = 4..7
FolderName = 'ExistsBeforeSequencing'
FileName = 'CreatedDuringSequencing'
Mode = 'Create'
}
)
$splats |
% { .\Alter-Folders.ps1 @_ }
$splats = @(
@{
Cases = 0..3
FolderName = 'CreatedDuringSequencing'
Mode = 'Remove'
}
@{
Cases = 4..11
FolderName = 'ExistsBeforeSequencing'
Mode = 'Remove'
}
@{
Cases = 1,3
FolderName = 'CreatedDuringSequencing'
FileName = 'CreatedBeforePublishing'
Mode = 'Create'
}
@{
Cases = 5,7,9,11
FolderName = 'ExistsBeforeSequencing'
FileName = 'CreatedBeforePublishing'
Mode = 'Create'
}
)
$splats |
% { .\Alter-Folders.ps1 @_ }
$splats = @(
@{
Cases = 2,3
FolderName = 'CreatedDuringSequencing'
FileName = 'CreatedByRunningApp'
Mode = 'Create'
}
@{
Cases = 6,7,10,11
FolderName = 'ExistsBeforeSequencing'
FileName = 'CreatedByRunningApp'
Mode = 'Create'
}
)
$splats |
% { .\Alter-Folders.ps1 @_ }
[CmdletBinding()]
param
(
[parameter(Mandatory=$true)]
[int32[]]
$cases,
[parameter(Mandatory=$true)]
[string]
$FolderName,
[string]
$FileName,
[parameter(Mandatory=$true)]
[string]
[ValidateSet('create','remove')]
$mode
)
$path = $env:ProgramData
if ( 'create' -eq $mode )
{
$cases |
% {
New-Item "$path\$FolderName$_" -ItemType Directory | Out-Null
New-Item "$path\$FolderName$_\$FolderName$_-1" -ItemType Directory | Out-Null
$filePath = "$path\$FolderName$_\$FolderName$_-1\$FileName$_-1.txt"
$filePath | Out-File $filePath
}
}
if ( 'remove' -eq $mode )
{
$cases |
% {
Remove-Item "$path\$FolderName$_" -Recurse -Force
}
}