Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Windows PowerShell 1.x/2.x/CTP

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Открыть новую тему     Написать ответ в эту тему

tcg2



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Microsoft Windows PowerShell

 
Обсуждаемые темы

    * Работа с SQL
    * Работа с Visual Studio
    * etc.

 
Помощь по использованию консоли pwsh, а также встроенной в Windows консоли powershell.exe  

Всего записей: 7 | Зарегистр. 20-11-2006 | Отправлено: 19:06 29-11-2006 | Исправлено: YuS 2, 18:04 02-06-2020
tong9

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хочется собрать SID'ы компьютеров запустив на контроллере домена
 
Почему-то не работает. Поправьте, плиз
 
 
$comps = dsquery computer -o rdn
foreach ($c in $comps) {Get-adcomputer -id $c}

Всего записей: 11 | Зарегистр. 27-02-2015 | Отправлено: 19:27 03-03-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tong9
 
Get-ADComputer -Filter <по вкусу> | Select Name,SID
 

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 19:44 03-03-2017
amr_now



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
174bpm
Цитата:
Или кто-то блокноты с калькуляторами делает на Powershell с интерфейсом на чистом WinAPI?

Вообще-то Powershell использует библиотеку .NET Framework.

Всего записей: 8604 | Зарегистр. 30-06-2006 | Отправлено: 17:00 04-03-2017
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
PowereShell скрипт(помогите)

Код:
#n количества символов по длине пути
$n = 100
 
#сканировать папку
$dir = $env:Temp
 
Get-ChildItem -Recurse -File -Force $dir | Where-Object {($_.FullName).Length -gt $n } | Format-Table -AutoSize -HideTableHeaders FullName

Всего записей: 3505 | Зарегистр. 16-08-2012 | Отправлено: 19:05 07-06-2017
daMIR



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Почему не перехватывается ошибка доступа к файлу в этом скрипте?

Код:
 
$log = "F:\test_hdd\log.txt"  
$Bafiles = Get-ChildItem -path F:\test_hdd\1\* -Include *.txt
ForEach-Object -process {
try {  
Get-Content $Bafiles  
}
catch {  
"bad!" >> $log  
Continue
}
"ok $_"  >> $log  
Remove-Item $Bafiles
}
 
 

 
Я хочу проверить на чтение файл. Если читается - удалить, если нет- записать в лог и перейти к следующему. При проверке скрипта если на файл нет прав, то скрипт не заходит в блок "catch "

Всего записей: 1757 | Зарегистр. 14-03-2004 | Отправлено: 02:47 08-10-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
либо  
Get-ChildItem -path F:\test_hdd\1\* -Include *.txt  |  
        Foreach-Object {
...
        }
 
либо  
$Bafiles = Get-ChildItem -path F:\test_hdd\1\* -Include *.txt  
foreach ($item in $Bafiles) {
....
}
 
------------
внутрь цикла положить
    try {
         Get-Content $_ -ErrorAction 'SilentlyContinue'
    } catch {
     ......
    }

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 03:30 08-10-2017 | Исправлено: LevT, 03:31 08-10-2017
daMIR



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Спасибо. Но что-то все равно не получается. Перепробовал разные варианты
 
 

Код:
$log = "F:\test_hdd\log.txt"  
$Bafiles = Get-ChildItem -path F:\test_hdd\1\* -Include *.txt  
foreach ($item in $Bafiles) {
try {  
Get-Content  $item -ErrorAction 'SilentlyContinue'  
}
catch {  
"bad!" >> $log  
Continue
}
"ok $_"  >> $log  
Remove-Item  $item
}
 

 
 
 

Код:
$log = "F:\test_hdd\log.txt"  
$Bafiles = Get-ChildItem -path F:\test_hdd\1\* -Include *.txt  |  
Foreach-Object {
try {  
Get-Content  $_  
}
catch {  
"bad!" >> $log  
Continue
}
"ok $_"  >> $log  
Remove-Item  $_
}
 

 
Собственно, идея простая: хочу проверить чтение файла. Если файл читается корректно, удалить, если читается с ошибками - перейти к следующему.
В тестовой папке два файла, один без прав доступа, второй нормальный.  
У меня либо оба раза заходит в catch  и в логе пишет "bad!" либо оба раза доходит до попытки удаления

Всего записей: 1757 | Зарегистр. 14-03-2004 | Отправлено: 14:36 08-10-2017
Ink0gnit0s

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
daMIR

Код:
 
$currentdir = Get-Location
$logfile = "$currentdir\log.txt"
$workdir = "$currentdir\test"
 
# очистка лога
$null > $logfile  
 
Get-Item -path $workdir\*.txt |  
ForEach {  
    $result = "ok"
     
    Get-Content -Path $_ -ErrorAction SilentlyContinue -ErrorVariable err
       
    if ( $err ) { $result = "bad" } else { Remove-Item $_ }
     
    Write-Output -InputObject "$("$_ ".PadRight(100, '.')) $result" | Out-File $logfile -Append
}
 

Всего записей: 311 | Зарегистр. 10-02-2009 | Отправлено: 20:36 08-10-2017
daMIR



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ink0gnit0s
Спасибо, работает. Жаль сам не догадался попробовать через if. Интересно почему не сработало по методу что в мануалах указан.
И скрипт довольно медленно работает. Из-за цикла или сам метод Get-Content так медленно читает? Впрочем, не принципиально.

Всего записей: 1757 | Зарегистр. 14-03-2004 | Отправлено: 00:47 17-10-2017
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
daMIR, тут несколько моментов. Если файл доступен для чтения, то не факт, что он доступен для записи/удаления. Зачем юзать Get-Content, если содержимое нигде не используется? В зависимости от размера файла, время и требуемые ресурсы могут быть большими.  
 
Может лучше пробовать открыть файл с правами на запись посредством .net FileStream?

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 09:15 17-10-2017 | Исправлено: NeoAnomaly, 09:15 17-10-2017
Ink0gnit0s

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
daMIR
Попробуйте скрипт, приведённый ниже. Но тут есть несколько нюансов: не учитывается принадлежность пользователя к группе, имеющей право чтения файла, не учитывается, как указал NeoAnomaly, наличие права у пользователя удалять файл.

Код:
 
$currentdir = Get-Location
$logfile = "$currentdir\log.txt"
$workdir = "$currentdir\test"
$currentuser = [Security.Principal.WindowsIdentity]::GetCurrent()
 
# очистка лога
$null > $logfile
 
Get-Item -path $workdir\*.txt |
ForEach {
    $result = "bad"
    $fileacls = (Get-Acl $_).Access
 
    foreach ($acl in $fileacls) {
        # проверка прав доступа к файлу для текущего пользователя
        if ( ($acl.IdentityReference -EQ $currentuser.Name) -AND ($acl.FileSystemRights -LIKE "*read*" -OR $acl.FileSystemRights -LIKE "*full*") ) {
            $result = "ok"
            # Если нет прав удаления файла, пропустить его
            Remove-Item -Path $_ -ErrorAction SilentlyContinue
            break
        }
    }
 
    Write-Output -InputObject "$("$_ ".PadRight(100, '.')) $result" | Out-File $logfile -Append
}
 
 
Либо измените немного предыдущий пример. Чтобы команда Get-Content не считывала всё содержимое файла, укажите дополнительный параметр: "-TotalCount 0" или "-Tail 0". Это должно увеличить скорость обработки файлов. В конечном счёте, код будет выглядеть следующим образом:

Код:
 
$currentdir = Get-Location  
$logfile = "$currentdir\log.txt"  
$workdir = "$currentdir\test"  
 
# очистка лога  
$null > $logfile  
 
Get-Item -path $workdir\*.txt |  
ForEach {  
    $result = "ok"  
     
    Get-Content -Path $_ -TotalCount 0 -ErrorAction SilentlyContinue -ErrorVariable err  
    #Get-Content -Path $_ -Tail 0 -ErrorAction SilentlyContinue -ErrorVariable err  
         
    if ( $err ) { $result = "bad" } else { Remove-Item $_ }  
     
    Write-Output -InputObject "$("$_ ".PadRight(100, '.')) $result" | Out-File $logfile -Append  
}  
 

Всего записей: 311 | Зарегистр. 10-02-2009 | Отправлено: 13:46 17-10-2017 | Исправлено: Ink0gnit0s, 20:30 17-10-2017
Lehix



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Братцы, помогите пожалуйста с написанием PowerShell скрипта. Требуется в XML файле найти 1 заданный банк по названию(title value=) или его id и вывести его курс $ и название банка(title value=).
В программировании не силён, до утра просидел ничего не получается...  
 
Должно получиться так: ПриватБанк USD 26.8000/27.1000
 
пример полного xml файла: http://resources.finance.ua/ua/public/currency-cash.xml
или основной кусок:
 
-------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<source id="currency-cash" date="2017-11-04T17:45:08+02:00">
    <organizations>
        <organization id="7oiylpmiow8iy1smb1e" oldid="1306" org_type="1">
            <title>"ЄВРОПРОМБАНК"</title>
            <branch value="false"/>
            <region id="ua,0,7oiylpmiow8iy1smadi"/>
            <city id="7oiylpmiow8iy1smadi"/>
            <phone value="0442774713"/>
            <address value="бул. Тараса Шевченка, 11"/>
            <link type="reference-info" href="http://organizations.finance.ua/ua/info/currency/-/7oiylpmiow8iy1smb1e/cash"/>
            <currencies><c id="EUR" br="31.1000" ar="31.5500"/><c id="RUB" br="0.4400" ar="0.4700"/><c id="USD" br="26.8800" ar="27.0200"/></currencies>
        </organization>
    </organizations>
</source>
-------------------------------
спасибо!

Всего записей: 13 | Зарегистр. 22-12-2008 | Отправлено: 06:01 05-11-2017 | Исправлено: Lehix, 06:02 05-11-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
-я тоже в программировании не силён, но умею воспользоваться готовым, что есть в PS везде и даром
 

Код:
 
$data = [xml]@'
<?xml version="1.0" encoding="UTF-8"?>  
<source id="currency-cash" date="2017-11-04T17:45:08+02:00">  
    <organizations>  
        <organization id="7oiylpmiow8iy1smb1e" oldid="1306" org_type="1">  
            <title>"ЄВРОПРОМБАНК"</title>  
            <branch value="false"/>  
            <region id="ua,0,7oiylpmiow8iy1smadi"/>  
            <city id="7oiylpmiow8iy1smadi"/>  
            <phone value="0442774713"/>  
            <address value="бул. Тараса Шевченка, 11"/>  
            <link type="reference-info" href="http://organizations.finance.ua/ua/info/currency/-/7oiylpmiow8iy1smb1e/cash"/>  
            <currencies><c id="EUR" br="31.1000" ar="31.5500"/><c id="RUB" br="0.4400" ar="0.4700"/><c id="USD" br="26.8800" ar="27.0200"/></currencies>  
        </organization>  
    </organizations>  
</source>
'@
 
write-output $data.source.organizations.organization
 
write-output $data.source.organizations.organization.currencies.c  
 

 
На этом месте начинается совсем немножко программирования.
Справитесь?

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 10:22 05-11-2017 | Исправлено: LevT, 10:28 05-11-2017
Lehix



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 

Код:
write-output $data.source.organizations.organization.currencies.c

На этом месте начинается совсем немножко программирования.
Справитесь?

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

Всего записей: 13 | Зарегистр. 22-12-2008 | Отправлено: 14:23 05-11-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
 
filter node { $_.node }
 
filter Select-USD {
    $title = select-xml -Xml $_ -XPath "title" | node
    $usd = select-xml -Xml $_ -XPath "currencies/c[@id='USD']" | node
 
    [PSCustomObject]@{
        Title=$title.value
        BR=$usd.br
        AR=$usd.ar
    }  
}
 
 
$orgs = $data.source.organizations.organization
$orgs | Select-USD
 

 
это правда тоже не 'программирование', а минимальное знание XPath
Которое я приобрёл буквально только что, из книжки.
 
Было трудно даже мне (давно в теме powershell)
Готов объяснить, что к чему
 
Добавлено:
Гномик-"программист" будет городить циклы на ровном месте, там где давно придуманы специальные языки.
 
XPath, да и сам Powershell это не "программирование", а знание могучих "магических" трюков.
Кстати, SQL ровно из той же серии.

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 16:56 05-11-2017 | Исправлено: LevT, 17:08 05-11-2017
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Lehix

Цитата:
Должно получиться так: ПриватБанк USD 26.8000/27.1000

Приватбанка не увидел в исходном файле
 
Подкорректируете под нужный id или под любой требуемый атрибут элемента:

Код:
[xml]$fle = cat currency-cash.xml -enc UTF8
$org = $fle.source.organizations.organization
$org|?{
    $_.id -eq '7oiylpmiow8iy1smau3'
}|%{
    $tlt = $_.title.value
    $_.currencies.c
}|%{
    if($_.id -eq 'USD'){
        $tlt+" "+$_.id+" "+$_.br+"/"+$_.ar
    }
}

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 17:49 05-11-2017 | Исправлено: YuS_2, 17:51 05-11-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Переписал функцию по универсальному шаблону
 

Код:
 
filter node { $_.node }
 
filter Select-USD {
    $HashProps = @{}
    $HashProps.Title = (select-xml -Xml $_ -XPath "title" | node).value
     
    $usd = select-xml -Xml $_ -XPath "currencies/c[@id='USD']" | node
 
    $HashProps.BR = $usd.br
    $HashProps.AR = $usd.ar
 
    New-Object -TypeName PSCustomObject -Property $HashProps    
}
 
$data.source.organizations.organization | Select-USD
 

 
 
Добавлено:
YuS_2
Только у меня на выходе объект, в отличие от --
И выходной объект, и функция поддаются повторному использованию
 

Код:
 
filter node { $_.node }
 
filter Select-Currency  
{
param (
    $Currency = 'USD'
)
    #$HashProps = @{}
    $HashProps.Title = (select-xml -Xml $_ -XPath "title" | node).value
    $HashProps.BR = (select-xml -Xml $_ -XPath "currencies/c[@id=$Currency]" | node).br
    $HashProps.AR = (select-xml -Xml $_ -XPath "currencies/c[@id=$Currency]" | node).ar
 
    New-Object -TypeName PSCustomObject -Property $HashProps    
}
 
 
$output = $data.source.organizations.organization | Select-USD  
 
$output |  
    sort BR -Descending |  
        select -expand Title -First 1
 

 
Добавлено:
 
 
 
Следующим шагом обобщаем функцию ещё дальше
 

Код:
 
filter node { $_.node }  
 
$selecttitle = {select-xml -Xml $_ -XPath "title" | node}
$selectcurrency = {select-xml -Xml $_ -XPath "currencies/c[@id=$Currency]" | node}
 
$input=@"
Title,$selecttitle,value
BR,$selectcurrency,br
AR,$selectcurrency,ar
"@
 
$output = $data.source.organizations.organization |
                       Select-Currency 'USD' -Template $input
 

 
функцию ещё чуток модифицировать под второй входной параметр...
 
 
 
 
Добавлено:
 
Точнее, даже под вот такой вход
 

Код:
 
$selecttitle = 'title'
$selectcurrency = 'currencies/c[@id=$Currency]'
 
@"
Property,XPathSelector,ItemToSelectAfter
Name,$selecttitle,value  
BR,$selectcurrency,br  
AR,$selectcurrency,ar  

"@  |  
       ConvertFrom-Csv -OutVariable input
 
$data.source.organizations.organization |  
        Select-Currency -Currency 'USD'  -SelectorSet $input
 

 
И ничего лишнего!
 

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 17:49 05-11-2017 | Исправлено: LevT, 00:28 06-11-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Итак, на входе (в виде HERE-документа курсивом) список желаемых к получению на выходе свойств нужного PS-объекта и рычажки, позволяющие достать из XML каждое из них.  
На выходе - массив PS-объектов, состоящих ровно из требуемых свойств  (то есть с его содержимым можно проделывать дальнейшие манипуляции в трубе).  
 
Функция Select-Currency выйдет поистине универсальной, предназначенной для построения PS-объектов по информации, содержащейся в широчайшем классе XML-исходников.  
И вероятно, что её придётся переименовать, чтобы название отражало суть )
 
Кто осилит её дописать?
 (можно взять за основу мой черновик ещё чуть выше)
 
 
Добавлено:
 
Вот это вот  
 

Код:
 
filter Select-Currency  
{  
    param (  
        $Currency = 'USD'  
    )  
    #$HashProps = @{}  
    $HashProps.Title = (select-xml -Xml $_ -XPath "title" | node).value  
    $HashProps.BR = (select-xml -Xml $_ -XPath "currencies/c[@id=$Currency]" | node).br  
    $HashProps.AR = (select-xml -Xml $_ -XPath "currencies/c[@id=$Currency]" | node).ar  
 
    New-Object -TypeName PSCustomObject -Property $HashProps    
}  
 

 
надо модифицировать под заданную внизу пред. поста спецификацию.

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 00:14 06-11-2017 | Исправлено: LevT, 00:24 06-11-2017
Lehix



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2

Цитата:
Подкорректируете под нужный id или под любой требуемый атрибут элемента:
 
Код:
[xml]$fle = cat currency-cash.xml -enc UTF8
$org = $fle.source.organizations.organization
$org|?{
    $_.id -eq '7oiylpmiow8iy1smau3'
}|%{
    $tlt = $_.title.value
    $_.currencies.c
}|%{
    if($_.id -eq 'USD'){
        $tlt+" "+$_.id+" "+$_.br+"/"+$_.ar
    }
}
 

 
Премного благодарен, - то что доктор прописал! в -eq '7oiylpmiow8iy1smau3' пишем id банка, скрипт ищет курс валют заданного банка и выдаёт результат в виде: банк валюта курс
Артада USD 26.9000/26.9500
 
Благодарю всех откликнувшихся, спасибо!

Всего записей: 13 | Зарегистр. 22-12-2008 | Отправлено: 00:28 06-11-2017 | Исправлено: Lehix, 00:29 06-11-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Lehix
однако если кто-то допишет функцию по моей спецификации - это будет универсальная удочка.
 
а рыбка, которую вам дал YuS_2 - она быстро будет съедена... и при небольшом изменении задачи вам придётся вновь просить "доброго рыболова" отвлечься от своих дел и для вас поработать.
Не сомневаюсь в его джентельменской готовности бесплатно, быстро и качественно суппортить всех им облагодетельствованных

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 00:36 06-11-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Windows PowerShell 1.x/2.x/CTP


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru