删除正在安装软件的脚本末尾的文件夹

时间:2016-10-03 16:28:49

标签: powershell

我有一个脚本将文件从服务器复制到c:\windows\temp\以安装Microsoft Office。我试图找出如何删除本地驱动器上的副本,我必须从服务器上复制以进行安装。我很好奇是否有办法在删除可能需要的文件之前确保安装完成。

Function Get-FileName{
[CmdletBinding()]
Param(
    [String]$Filter = "|*.*",
    [String]$InitialDirectory = "C:\")

    [void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
    $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
    $OpenFileDialog.initialDirectory = $InitialDirectory
    $OpenFileDialog.filter = $Filter
    [void]$OpenFileDialog.ShowDialog()
    $OpenFileDialog.filename
}

$file = Get-FileName -InitialDirectory $env:USERPROFILE\Desktop -Filter "Text files (*.txt)|*.txt|All files (*.*)|*.*"
ForEach ($item in (Get-Content $file)) {
    $sitem = $item.Split("|")
    $computer = $sitem[0].Trim()
    $user = $sitem[1].Trim()

    $filepath = Test-Path -Path "\\$computer\c$\Program Files (x86)\Microsoft Office\"
    If ($filepath -eq $false) {
    Get-Service remoteregistry -ComputerName $computer | Start-Service

    Copy-Item -Path "\\server\Install\Office2010" -Destination "\\$computer\c$\windows\temp\" -Container -Recurse -Force

    <#
    $InstallString = '"C:\windows\temp\Office2010\setup.exe"'
    ([WMICLASS]"\\$computer\ROOT\CIMV2:Win32_Process").Create($InstallString)

    "$computer" + "-" + "$(Get-Date)" | Out-File -FilePath "\\server\Install\Office2010\RemoteInstallfile.txt" -Append
    #>
    } Else {
        "$computer" + "_Already_Had_Software_" + "$(Get-Date)" | Out-File -FilePath "\\server\Install\Office2010\RemoteInstallfile.txt" -Append
    }
}

想知道我是否可以在此代码中的某处插入该部分,然后继续删除此文件夹?

$folderToDelete = "\\$computer\c$\windows\temp\"

$ErrorActionPreference= 'silentlycontinue'
[io.directory]::delete($folderToDelete, $true)
$fso = New-Object -ComObject scripting.filesystemobject
$fso.DeleteFolder($folderToDelete,$true)
if (Test-Path ($folderToDelete)) {
 New-Item -ItemType directory -Path .\EmptyFolder
 robocopy .\EmptyFolder $folderToDelete /mir
 Remove-Item .\EmptyFolder
 Remove-Item $folderToDelete
}

但我不确定在删除之前安装是否会完成?有没有人做过这样的事情,想分享一些指导?

1 个答案:

答案 0 :(得分:2)

由于您使用([WMICLASS]"\\$computer\ROOT\CIMV2:Win32_Process").Create($InstallString)启动流程,因此传递PID比使用Start-Process or Invoke-Command更难。所以像克里斯N说你想抓住PID并等待它关闭。但由于远程计算机不支持.waitforexit(),因此您可以采用以下两种方式之一。

通过调用命令:(由于您没有使用它来首先运行安装命令,因此可能不是一个选项)

$PID = (Get-Process setup -computername $computer).id
Invoke-Command -ComputerName RemoteComputer -ScriptBlock { param($ProcessId) Wait-Process -ProcessId $ProcessId } -ArgumentList $PID

while循环,检查进程是否已完成:

$processid = (Get-Process setup -computername $computer).id
while ($null -ne $processid) {
    Start-Sleep -m 250
}

此外,您的删除部分似乎也不必复杂。

$folderToDelete = "\\$computer\c$\example"
if (Test-Path ($folderToDelete)) {
    Remove-Item $folderToDelete -Recurse -Force
}

另外一件事,在您的脚本中将ErrorActionPreference设置为Silently Continue通常是不好的做法。通常答案是使用Try / Catch

捕获正确的错误