App-V应用程序看到或写入本地文件的条件是什么?

对于我已经testing过的一些应用程序,App-V似乎只是做正确的工作。 然而,在其他情况下,我发现应该驻留在本地文件系统上的一些文件是虚拟化的。 这是一个问题,因为这些文件不能经受虚拟化应用程序的“修复”。

我认为将VFS文件夹设置为合并模式将允许应用程序写入本地文件系统。 但是,一个简单的testing表明,这似乎并不是这种情况。 显然,必须有规则来规定哪些文件是从本地文件系统读取和写入的,而不是VFS。

App-V应用程序读取或写入本地文件系统的条件是什么?

TL; DR

当相应的VFS文件夹处于“合并”模式 VFS中未提及相应的文件夹时,虚拟化应用程序可以看到本地文件系统上存在的文件。 但是,当相应的VFS文件夹处于“覆盖”模式时, 无法看到相同的文件。

当以下两个条件都成立时,虚拟化应用程序只写入本地文件系统:

  • 在VFS中没有提到写入文件的文件夹,
  • 写入文件的文件夹存在于本地文件系统中

我没有find权威的文件来回答这个问题。 我发现的最近的信息是KalleSaunamäki2011年关于 App-V 4.6的博客文章 。 事实certificate,不仅仅是这个post只是在外围的on-point,但至less有一个情况下,App-V 5.x行为似乎也发生了变化(即App-V 5.x似乎并没有创build缺less的合并 – 在本地文件系统上的模式VFS文件夹了,而Kalle似乎目睹了4.6这样做)。

实证检验

我的粗糙的实验只是导致了混乱的结果,所以我决定进行一些更正式的testing来得到这个结果。

build立

testing包括在以下每个阶段创build文件:

  • 答:sorting前
  • B:从音序器内部进行sorting期间
  • C:发行前
  • D:从应用程序内部的虚拟进程发布之后

在测序结束时,VFS如何应用于文件夹有三种可能的情况:

  • 覆盖模式
  • 合并模式
  • 没有提到

在发布阶段,任何给定的文件夹都可以创build或不在每个本地和虚拟文件系统中。 这是四个可能性。

VFS适用的三种方式与四种出版可能性相结合导致我testing了12个案例。 我使用了一些脚本来自动化,并希望避免错误。 这些脚本是在这篇文章的末尾。

结果

从音序器UI看到的VFS如下所示:

在这里输入图像说明

我检查了已发布的应用程序的泡沫内部和外部脚本所写的每个文件的存在。 结果在这张表里:

在这里输入图像说明

分析

根据下表,看起来像下面的声明:

  • 该应用程序可以看到由正在运行的虚拟化应用程序创build的所有文件。 这并不奇怪,因为这是应用程序运行所必需的。
  • 当相应的VFS文件夹处于“覆盖”模式时,虚拟化应用程序无法看到本地文件系统上存在的文件。
  • 当相应的VFS文件夹处于“合并”模式 VFS中未提及相应的文件夹时,虚拟化应用程序可以看到本地文件系统上存在的文件。
  • 在以下两种情况都是正确的情况下,虚拟化应用程序写入本地文件系统的唯一情况是:
    • 在VFS中没有提到写入文件的文件夹,
    • 写入文件的文件夹存在于本地文件系统中

脚本

A-之前,sequencing.ps1

$splat = @{ Cases = 4..11 FolderName = 'ExistsBeforeSequencing' FileName = 'ExistsBeforeSequencing' Mode = 'Create' } .\Alter-Folders.ps1 @splat 

B-期间-sequencing.ps1

 $splats = @( @{ Cases = 0..3 FolderName = 'CreatedDuringSequencing' FileName = 'CreatedDuringSequencing' Mode = 'Create' }, @{ Cases = 4..7 FolderName = 'ExistsBeforeSequencing' FileName = 'CreatedDuringSequencing' Mode = 'Create' } ) $splats | % { .\Alter-Folders.ps1 @_ } 

C-前-publishing.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 @_ } 

d-APP-running.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 @_ } 

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 } }