2016-10-03 80 views
0

我有一個腳本將文件從服務器複製到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

你可以從你用來啓動安裝程序的WMI方法中獲取PID,而不是Get-process -id $ thatpid,請等待 –

回答

2

由於您使用([WMICLASS]"\\$computer\ROOT\CIMV2:Win32_Process").Create($InstallString)開始此過程,因此通過PID要比使用Start-Process or Invoke-Command稍微困難一些。所以就像Chris N說你想抓住PID並等待它關閉。但由於.waitforexit()在遠程機器上不受支持,因此您可以通過以下兩種方式之一完成此操作。

通過調用命令:如果過程已經完成(這可能不是一種選擇,因爲你沒有用它來擺在首位運行setup命令)

$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繼續在你的腳本中通常是不好的做法。通常,答案是一個適當的錯誤捕捉Try/Catch

+0

我可以問你一些問題以及。我的腳本沒有正常工作,只是吐出一些奇怪的消息。我很好奇,如果你能告訴我這意味着什麼,因爲它沒有安裝微軟辦公軟件。 __GENUS:2 __CLASS:__PARAMETERS __SUPERCLASS: __DYNASTY:__PARAMETERS __RELPATH: __PROPERTY_COUNT:2 __DERIVATION:{} __SERVER: __NAMESPACE: __PATH: 的ProcessID: 返回值:8 PSComputerName: –

+0

不幸[即誤差沒有太大用處。](https://msdn.microsoft.com/en-us/library/aa389388(v = vs.85).aspx)它表示未知錯誤。它來自您用於開始設置的Win32_Process類的Create Method。在您的腳本的情況下,它的意思是「無法啓動setup.exe的原因不明」 – BenH

+0

hmmm也許我不能使用一個變量?也許它需要裏面的路徑.Create()? –

相關問題