使用PowerShell

时间:2017-04-20 11:03:01

标签: powershell

我有一个PowerShell脚本,用于比较两个不同文件夹中的两个文件。如果第一个文件夹中存在具有正确编号的文件,则它会运行它。

如果文件不存在于第一个文件夹中,则会将其从第二个文件夹复制到第一个文件夹,然后从第一个文件夹中运行。

function Invoke-InstallationOfANewBuild()
{
    param (
        $ptud = "$($env:USERPROFILE)\Desktop\",
        $ptbf = "\\r\P\Al\O\D B\R 017\x64"
    )

    begin { 
        $output1 = Get-ChildItem $ptbf -Filter *.exe | Where Name -NotMatch '.*NoDB\.exe$' | % {
            New-Object psobject -Property @{
                No = [int]([regex]::Match($_.Name, '(?<=CL)\d+').Value)
                Name = $_.FullName
            } 
        } | Sort No -Descending | Select -ExpandProperty Name -First 1

        $output2 = Get-ChildItem $ptbf -Filter *.exe | Where Name -NotMatch '.*NoDB\.exe$' | % {
            New-Object psobject -Property @{
                No = [int]([regex]::Match($_.Name, '(?<=CL)\d+').Value)
                Name = $_.FullName 
            } | Sort No -Descending | Select -ExpandProperty Name -First 1 
        }

        Compare-Object -ReferenceObject $output1 -DifferenceObject $output2
    }

    process { 

        if ($LASTEXITCODE = 0)
        { 
            Get-ChildItem $ptud -Filter *.exe | Where Name -NotMatch '.*NoDB\.exe$' | % {
                New-Object psobject -Property @{
                    No = [int]([regex]::Match($_.Name, '(?<=CL)\d+').Value)
                    Name = $_.FullName
                }

            } | Sort No -Descending | Select -ExpandProperty Name -First 1 | Foreach { & $_ -s2 -sp"-SilentInstallation=standalone -UpdateMaterials=yestoall -UpgradeDBIfRequired=yes" }
        }
        else
        {
            Get-ChildItem  $ptbf -Filter *.exe | Where Name -NotMatch '.*NoDB\.exe$' | % {
                New-Object psobject -Property @{
                    No = [int]([regex]::Match($_.Name, '(?<=CL)\d+').Value)
                    Name = $_.FullName
                }

            } | Sort No -Descending | Select -ExpandProperty Name -First 1 | Copy-Item -Destination $ptud | Foreach { & $_ -s2 -sp"-SilentInstallation=standalone -UpdateMaterials=yestoall -UpgradeDBIfRequired=yes" }
        }
    } 

    end { return $LASTEXITCODE }
}

我在else块中遇到问题 - 从第二个文件夹到第一个文件夹的文件副本但文件执行没有启动。

此外,我正在寻找具有if块的更好解决方案。我想说 - 如果操作Compare-Object返回true而不是启动if块中的所有内容,则操作返回false(例如,文件中存在此类不存在的文件)第一个文件夹) - 然后在else块中启动所有内容。

1 个答案:

答案 0 :(得分:1)

对于你的比较试试这个:

$compare = Compare-Object -ReferenceObject $A -DifferenceObject $B | 
    Where-Object { $_.SideIndicator -eq '=>' } | 
        Measure-Object -Property inputObject
$compare.count -gt 0 # for your if condition

对于您的副本对象问题,请尝试以下方法: Tee-Object将管道复制到变量

Get-ChildItem  $ptbf -Filter *.exe | Where Name -NotMatch '.*NoDB\.exe$' | % {
                New-Object psobject -Property @{
                    No = [int]([regex]::Match($_.Name, '(?<=CL)\d+').Value)
                    Name = $_.FullName
                }

            } | Sort No -Descending | Select -ExpandProperty Name -First 1 | Tee-Object -variable Duplicate | Copy-Item -Destination $ptud 
$duplicate | Foreach { & $_ -s2 -sp"-SilentInstallation=standalone -UpdateMaterials=yestoall -UpgradeDBIfRequired=yes" }