Для некоторых приложений, которые я использовал, App-V, кажется, делает именно то, что необходимо для правильной работы приложения. Однако в других случаях я обнаружил, что несколько файлов, которые должны находиться в локальной файловой системе, виртуализированы. Это проблема, потому что эти файлы не выдерживают «ремонта» виртуализированного приложения.
Я думал, что установка папки VFS в режим слияния позволит приложению писать в локальную файловую систему. Однако простой тест показал, что это не так. Очевидно, должны быть правила, определяющие, какие файлы считываются и записываются в локальную файловую систему, а не в VFS.
При каких условиях локальная файловая система считывается или записывается приложением App-V?
TL; DR
Файлы, существующие в локальной файловой системе жестяная банка быть видимым виртуализированным приложением, когда соответствующая папка VFS находится в режиме «слияния» или соответствующая папка не упоминается в VFS. Но те же файлы не может быть видимым, когда соответствующая папка VFS находится в режиме «переопределения».
Виртуализированное приложение записывает в локальную файловую систему только в том случае, если выполняются оба следующих условия:
Мне не удалось найти авторитетную документацию, чтобы ответить на этот вопрос. Самая близкая информация, которую я нашел, была Сообщение в блоге Калле Саунамяки 2011 г. о App-V 4.6. Оказывается, не только эта публикация выполняется только периферийно, но и поведение App-V 5.x также, похоже, изменилось по крайней мере в одном случае (например, App-V 5.x, похоже, не создает недостающие объединенные- режим папок VFS в локальной файловой системе, тогда как Kalle, похоже, был свидетелем этого в 4.6).
Мои грубые эксперименты привели к путанице в результатах, поэтому я решил провести еще несколько формальных тестов, чтобы разобраться в этом.
Тест включал создание файлов на каждом из следующих этапов:
Существует три возможных случая применения VFS к папке в конце секвенирования:
На этапе публикации любая заданная папка может быть создана или нет в каждой из локальной и виртуальной файловых систем. Это четыре возможности.
Три способа применения VFS в сочетании с четырьмя возможностями публикации дали результаты в 12 случаях, которые я тестировал. Я использовал несколько скриптов, чтобы автоматизировать это и (надеюсь) избежать ошибок. Эти сценарии находятся в конце этой публикации.
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
}
}