Скрипт Powershell для получения полного пути и версии файла - PullRequest
0 голосов
/ 04 апреля 2020

Моя конечная цель - получить все исполняемые файлы, которые ниже версии 1.0.0.0, и обновить эти папки новыми обновленными файлами, скопировав их в него.

Есть несколько мест назначения, в которых они находятся, а именно наш терминальные серверы. давайте использовать приведенный ниже пример.

$RDP1Path = "\\RDP01\C$\Program Files (x86)\Software\"
$RDP2Path = "\\RDP02\C$\Program Files (x86)\Software\"
$RDP3Path = "\\RDP03\C$\Program Files (x86)\Software\"
$RDP4Path = "\\RDP04\C$\Program Files (x86)\Software\"

В «Программном обеспечении» 10–15 разных папок, и у каждой папки одно и то же exe-имя «Software.exe», но они разные для каждого клиента, а не для всех клиентов. работают в той же версии. У нас есть обновление для всех клиентов, работающих под управлением версии 1.0.0.0, и нам необходимо обновить их до версии 1.0.0.1

. Любой, кто работает под управлением версии 0.0.9.0, не должен обновляться.

Любые идеи как я go об этом?

Сейчас я могу получить список всех exe-файлов внутри папки, но я не могу каким-либо образом использовать хост записи для чтения файловой версии каждого

$GetFullPaths = get-childitem $RDP1Path-Recurse | where {$_.Name -eq "Software.exe"} | % {Write-Host $_.FullName}

Это дает мне следующий вывод:

\\RDP01\C$\Program Files (x86)\Software\Client1\Software.exe
\\RDP01\C$\Program Files (x86)\Software\Client2\Software.exe
\\RDP01\C$\Program Files (x86)\Software\Client3\Software.exe
\\RDP01\C$\Program Files (x86)\Software\Client4\Software.exe
\\RDP01\C$\Program Files (x86)\Software\Client5\Software.exe

Как мне действовать дальше.

1 Ответ

0 голосов
/ 04 апреля 2020

Если у вас есть разрешения для этого, а Software.exe в данный момент не запущен, вы можете сделать это с помощью приведенного ниже кода:

$serverNames     = 'RDP01','RDP02','RDP03','RDP04'   # an array of server names
$newSoftwareFile = 'D:\SoftwareNew\Software.exe'     # the full path and filename to the new version
$versionToUpdate = [version]'1.0.0.0'                # the version of the exe to be replaced

# loop through the servers list, find the exe with productversion 1.0.0.0
# and when found, copy the new file to that directory.
foreach($server in $serverNames) {
    $path = '\\{0}\C$\Program Files (x86)\Software' -f $server
    Get-ChildItem -Path $path -Filter 'Software.exe' -Recurse -File |
        Where-Object { $_.VersionInfo.ProductVersionRaw -eq $versionToUpdate } |
        ForEach-Object { 
            Write-Host "Updating '$($_.FullName)'"
            # you may need to first stop the process if software.exe is currently running
            # and after copying the new version start it up again...
            Copy-Item -Path $newSoftwareFile -Destination $_.DirectoryName -Force
        }
}

Вы также можете отказаться от использования код попробуйте заменить файл, но просто верните список обновляемых путей. В этом случае выполните:

# loop through the servers list, find the exe with productversion 1.0.0.0
# and when found, output the file path and capture in variable $result
$result = foreach($server in $serverNames) {
    $path = '\\{0}\C$\Program Files (x86)\Software' -f $server
    Get-ChildItem -Path $path -Filter 'Software.exe' -Recurse -File |
        Where-Object { $_.VersionInfo.ProductVersionRaw -eq $versionToUpdate } |
        ForEach-Object { $_.FullName }
}

# output on screen
$result

# or write to text file
$result | Set-Content -Path 'D:\softwareToUpdate.txt'

Если вы хотите получить список только файлов «Software.exe» вместе с номерами их версий, используйте:

# loop through the servers list, find the exe and return FullName and versions
$result = foreach($server in $serverNames) {
    $path = '\\{0}\C$\Program Files (x86)\Software' -f $server
    Get-ChildItem -Path $path -Recurse -File |
    Select-Object @{Name = 'Path'; Expression = {$_.FullName}},
                  @{Name = 'ProductVersion'; Expression = {$_.VersionInfo.ProductVersionRaw}},
                  @{Name = 'FileVersion'; Expression = {$_.VersionInfo.FileVersionRaw}}
}

# output on screen
$result | Format-Table -AutoSize

# or write to csv file
$result |Export-Csv -Path 'D:\softwareVersions.csv' -NoTypeInformation

Помимо ProductVersionRaw, исполняемый файл также будет иметь свойство FileVersionRaw. Оба являются [version] объектами, и они не обязательно одинаковы, поэтому убедитесь, что вы используете правильную версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...