Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Наличие текста с условиями в PS (http://forum.oszone.net/showthread.php?t=327733)

Luka666 20-06-2017 07:44 2746025

Наличие текста с условиями в PS
 
Друзья, здравствуйте.
Помогите пожалуйста, сам не могу сообразить.
Необходимо написать код с следующими условиями:
Есть файл Q:\file.xml необходимо читать этот файл и если в нём есть текст "version 7,2", то if , а если данного текста в этом файле нет то else
Подскажите пожалуйста.
Спасибо!

Iska 20-06-2017 07:56 2746027

Если «version 7,2» гарантированно а) уникальна и б) будет размещена в одной строке, и если кодировка не окажется UTF-16 или экзотичней — достаточно простого Select-String.

Как обычно: если бы Вы упаковали file.xml в архив и приложили таковой к сообщению — было бы точнее.

Luka666 20-06-2017 08:12 2746028

Цитата:

Цитата Iska
Если «version 7,2» гарантированно а) уникальна и б) будет размещена в одной строке, и если кодировка не окажется UTF-16 или экзотичней — достаточно простого Select-String.
Как обычно: если бы Вы упаковали file.xml в архив и приложили таковой к сообщению — было бы точнее. »

Понятно шта select-string тока как по уму расставить всё?

xml файл не обязательно вкладывать, вот всё его содержимое:

Цитата:

<?xml version="1.0" encoding="utf-8"?>
<systemMetadata version="17.6.7.1" />

Мне нужно для сверки конкретных версий, в данном слчае: 17.6.7.1

Iska 20-06-2017 08:32 2746030

Цитата:

Цитата Luka666
xml файл не обязательно вкладывать, вот всё его содержимое: »

А потом внезапно™ оказывается, что его кодировка вовсе не utf-8 (плюс — есть BOM/нет BOM), концы строк в формате Mac :). Я не про Ваш конкретный случай, а вообще. Такое бывало сплошь и рядом. Потому — файл, упакованный в архив, а не просто содержимое.

Код:

$sSourceFile = 'C:\Мои проекты\0089\file.xml'

if(Test-Path -Path $sSourceFile -PathType Leaf) {
    if(Select-String -Path $sSourceFile -Pattern '17.6.7.1' -SimpleMatch -Quiet) {
        Write-Host "Found"
    } else {
        Write-Host "Not found"
    }
} else {
    Write-Host "Can't find source file [$sSourceFile]." -ForegroundColor Red
}

Но правильнее будет обращаться к xml-файлу, как к xml, разбирать содержимое, находя узел systemMetadata, и обращаться к свойству value его атрибута version. Полученное значение разбивать по точке на компоненты номера версий, каковые затем сравнивать с искомым номером версии.

greg zakharov 20-06-2017 08:42 2746031

Код:

[xml]$xml = (gc .\source.xml -ea 0)
# версии сравниваются как строки
if ($xml -ne $null -and $xml.systemMetadata.version -eq '17.6.7.1') {
  'do something'
}
# можно сравнивать именно как версии
[version]$a = $null
[version]$b = New-Object Version('17.6.7.1') # эталонная версия
if ([version]::TryParse($xml.systemMetadata.version, [ref]$a)) {
  if ($a -eq $b) {
    'do something'
  }
}


Iska 20-06-2017 08:50 2746034

greg zakharov, здесь:
Цитата:

Цитата greg zakharov
[version]$b = New-Object Version('17.6.7.1') »

обязательно нужно приводить к типу?

greg zakharov 20-06-2017 09:48 2746053

Iska, это просто пример.

Luka666 20-06-2017 13:20 2746091

Спасибо. Помогло. Воспользовался просто строками, как наиболее простым решением.

Iska 20-06-2017 13:47 2746098

Лучше воспользуйтесь этим:
Цитата:

Цитата greg zakharov
Код:

# можно сравнивать именно как версии
[version]$a = $null
[version]$b = New-Object Version('17.6.7.1') # эталонная версия
if ([version]::TryParse($xml.systemMetadata.version, [ref]$a)) {
  if ($a -eq $b) {
    'do something'
  }
}

»



Время: 21:54.

Время: 21:54.
© OSzone.net 2001-