Tenho este script de provisionamento que copia um arquivo de um servidor para um cliente. Este exemplo tem um aplicativo Access Runtime que precisa ser instalado localmente no cliente.
Se a pasta de destino não existir, ela será criada primeiro e depois o arquivo será colado nela.
# Install myFolder
$install_Folder = {
echo 'Creating folder...'
New-Item -Path "C:\Program Files\" -Name "myProgram" -type directory
icacls 'C:\Program Files\pzCAFM' /grant:r 'User:(OI)(CI)F'
echo 'Done.'
}
# Install myFile
$install_File = {
echo 'Copying the file to destination...'
Copy-Item "\\myserver\myshare\Database.accdr" -Destination "C:\Program Files\myprogram\"
echo 'Done.'
}
# Check if the folder exists and go to install otherwise start deployment
if (Test-Path -Path 'C:\Program Files\myProgram')
{
echo 'Folder exists. Stopping any open process...'
if (Get-Process -Name 'MSACCESS'){
Stop-Process -Name 'MSACCESS'
Start-Sleep -Seconds 2
Remove-Item -Path 'C:\Program Files\myProgram\Database.laccdr' -Force
Start-Sleep -Seconds 2
}
echo 'Folder exists. Proceed with updating the file'
.$install_File
}
else {
echo 'Folder not found. Proceed with initial deployment.'
.$install_myFolder
Start-Sleep -Seconds 5
.$install_File
echo 'Installation complete'
}
Você definiu blocos de script e os armazenou em variáveis, mas nunca os 'executou' usando
Invoke-Command -ScriptBlock $install_myXX
.Veja about_Script_Blocks
Por que não fazer essas funções como
Em seguida, no seu
else
bloco, simplesmente chame a funçãoInstall-MyFolder
em vez de escrever$install_myFolder
como você faz agora.Mais uma dica: como o Powershell lê e executa de cima para baixo, você deve definir seus scriptblocks e/ou funções ANTES de chamá-los. Ao colocá-los por último no seu código, eles só serão conhecidos em uma execução secundária.