PDA

Показать полную графическую версию : [решено] Наличие текста с условиями в PS


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

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

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

Luka666
20-06-2017, 08:12
Если «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
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
[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
greg zakharov, здесь:
[version]$b = New-Object Version('17.6.7.1') »
обязательно нужно приводить к типу?

greg zakharov
20-06-2017, 09:48
Iska, это просто пример.

Luka666
20-06-2017, 13:20
Спасибо. Помогло. Воспользовался просто строками, как наиболее простым решением.

Iska
20-06-2017, 13:47
Лучше воспользуйтесь этим:
# можно сравнивать именно как версии
[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'
}




© OSzone.net 2001-2012