• Почему переменная перестала выводить ответ?

    @MaxKozlov Куратор тега PowerShell
    У вас так всё намешано...
    Где-то forma-table, где-то просто "вывод", где-то чтение с хоста.
    Get-Srv($param), который в случае двух параметров превратится в массив...
    Не выводится, скорее всего, потому, что PS очень хочет вам угодить, пытаясь подстроить вывод. Но не может :)

    Я бы предложил хорошенько поработать над структурой, убрать рекурсию и правильно разделить ответственность между функциями
    типа
    function Show-SrvFolderList($kat_addr) { # Получаем на вход уже готовый путь к серверу
        Get-Children -Path $kat_addr | Format-Table Name
    }
    function Show-FolderAccess($inp_res) { #  увидеть список групп, с исключениями
        $lol2 = Get-Acl $inp_res
        $lol2 = $lol2.Access | Where-Object {
            $_.IdentityReference -notlike "*blabla1*" -and
            $_.IdentityReference -notlike "*blabla2*" -and 
            $_.IdentityReference -notlike "*blabla3*" -and 
            $_.IdentityReference -notlike "*blabla4*" -and 
            $_.IdentityReference -notlike "*blabla5*"
        }
        $lol2 | Format-Table
    }
    
    $srv_name = Read-Host "Введите сервер"
    $kat_addr = '\\' + $srv_name + '\Folder' # На каждом сервере есть определенная папка \Folder, которая подставляется в Get-Children. 
    do {
        Show-SrvFolderList
        # После того, как увидели все каталоги, можем выбрать один из них
        $inp_res = Read-Host "Введите ресурс или 1"
        if ($inp_res -eq '1') { break }
        Show-FolderAccess ($kat_addr + '\'  + $inp_res)
    } while ($true)


    Функции переименованы, чтобы было понятно что они делают
    Причём они Show, а не Get, потому что на самом деле они ничего не возвращают, а только показывают
    Ответ написан
    1 комментарий
  • Получить вывод команды командной оболочки в переменную makefile?

    @MaxKozlov Куратор тега PowerShell
    1. Вот тут придумали рекурсивный вызов
    https://stackoverflow.com/questions/4883021/how-to...

    2.
    не имею ни малейшего представления насчёт фич nmake, но может быть, у него есть что-то, что проверяет, например, дату создания/редактирования файла ? тогда можно обойтись без запуска самого powershell.

    Кстати, переменная $PSVersionTable появилась именно в v2, поэтому проверка типа IF $(psvr) <= 2 вам вообще недоступна, в принципе :)

    3. Если nmake умеет обрабатывать код возврата, то можно так:
    powershell -nologo -noprofile "exit $psversiontable.psversion.major"

    В коде возврата версию вернёт
    проверял на батнике
    @powershell -nologo -noprofile "exit $psversiontable.psversion.major"
    @echo %ERRORLEVEL%
    Ответ написан
  • Бесовщина в PowerShell?

    @MaxKozlov Куратор тега PowerShell
    Для правильного запуска необходимо указывать рабочий каталог
    например -WorkingDirectory C:\

    параметры можно передавать как
    $argument1 = '-noprofile -command "Start-Process powershell.exe -Verb RunAs -ArgumentList ''-noprofile -file C:\run.ps1''"'
    Start-Process -FilePath "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Credential $credential -ArgumentList $argument1
    Ответ написан
    Комментировать
  • Можно ли в скрипте PowerShell получить права администратора?

    @MaxKozlov Куратор тега PowerShell
    В вашей постановке задачи - даёте пользователю админский логин м пароль, пусть сам запускает :)
    Всё равно в скрипте подсмотрит

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

    Создаёте на нужных компах задачу, запускающуюся с нужными правами и потом себя удаляющую.
    Можно даже из под SYSTEM, там пароль не нужен (это если сеть задаче тоже не нужна)
    Ответ написан
  • Как в Powershell вывести сообщение из логов полностью?

    @MaxKozlov Куратор тега PowerShell
    На экран выводится форматированная надпись. Естественно, целиком она может не влзеть
    Вариантов масса
    Вы можете, например, или вывести только текст
    Get-WinEvent -LogName Application -MaxEvents 10 | Select-Object -ExpandProperty Message

    или, например, перенаправить всё это в csv
    Get-WinEvent -LogName Application -MaxEvents 10 | Select-Object Machinename, TimeCreated, Message | Export-csv -Path d:\111.csv
    и смотреть уже его
    Можно записать вывод в переменную и детально смотреть её содержимое
    $e = Get-WinEvent -LogName Application -MaxEvents 10
    $e[0].Message
    Ответ написан
    1 комментарий
  • Получение информации по жестким дискам через powershell?

    @MaxKozlov Куратор тега PowerShell
    Проверил код отсюда - Tell whether SSD or not in C#
    Вполне рабочий метод. Реализуется целиком из Powershell v5.1 и v7.3

    • No seek penalty - работает из под любого юзера
    • Nominal media rotation rate - только с админскими правами


    Копия кода чтобы не потерялся. Без доработки под PS
    Целиком в ответ вложить места не хватает

    upd: Превратил код в рабочий скрипт Powershell
    Get-PhysicalDriveType.ps1
    Ответ написан
    2 комментария
  • Как настроить сеть в ESXi 8 для белых ip?

    @MaxKozlov
    у хоста ESXI нет "ip", у него есть VMKernel адаптер + PortGroup, на котором стоит галка management network, и на нём заведён ваш адрес из 1.1.1.1/30

    Если у вас сеть заведена на VMWare через тегированный порт, а на VMKernel Portgroup с management network у вас нет VlanID - это неверно.

    заводится сеть на хост (транк)
    для management у вас уже есть VMKernel - на нём остаётся тот же адрес PortGroup, но с проставленным VlanID от вашей сети 1.1.1.1/30

    Для внешних машин создаётся PortGroup с VlanID от 2.2.2.2/29
    Именно эта сеть раздаётся машинам. на самих машинах раздаются ip
    Ответ написан
  • [WARNING]: Updating cache and auto-installing missing dependency: python3-apt?

    @MaxKozlov
    используйте модуль Package если хотите сделать универсально.
    или when, если отдельно.
    в вашем оригинальном коде when только одна штука, а надо на каждый yum/apt его прописывать

    - name: Install Zabbix-release CentOS 7
      yum:
        name: https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/z...
    # --тут тоже нужен when
    
    - name: install zabbix-agent
      yum: name=zabbix-agent state=latest
      when: ansible_os_family == "RedHat"


    p.s. и уберите код в тэг <code>, форматирование сбиваться не будет
    Ответ написан
  • Как в PowerShell в Get-ADGroup применить фильтр с перечислением значений?

    @MaxKozlov Куратор тега PowerShell
    -Filter в Get-ADGroup не поддерживает -in, так как он транслируется в LDAP запрос
    Так что такая фильтрация возможна только после получения всех групп
    Get-ADGroup -Filter '*' | Where-Object { $_.ObjectGUID -in 'xxx', 'yyy', 'zzz' }

    Вместо * лучше какой-то предварительный фильтр сделать, если групп сильно много

    ну или намутить свой построитель фильтра, но там можно упереться в длину запроса.
    типа
    $Filter = "ObjectGUID -eq '" + ('xxx', 'yyy', 'zzz' -join "' -or ObjectGUID -eq '") + "'"
    Ответ написан
    1 комментарий
  • Имя входа пользователя Samaccountname Userprincipalname, как задать одинаковое значение?

    @MaxKozlov Куратор тега PowerShell
    Ну, строго говоря, оно не может быть одинаковым

    Обычно,
    userPrincipalName = samAccountName + '@' + $DomainName


    $DomainName при этом может быть как $env:USERDNSDOMAIN, так и, например, (Get-ADDomain).DNSRoot
    Ещё вариант может быть такой
    $domain = Get-ADDDomain
    $DomainName = $domain.Name + $domain.ParentDomain
    смотря от кого получаешь данные...

    ну а дальше смотри ответ Alexey Dmitriev
    Ответ написан
    2 комментария
  • С помощью Select-String можно найти текстовый шаблон в файле на клиенте. Как найти в сети?

    @MaxKozlov Куратор тега PowerShell
    Примерно также :)
    выкачиваете из сети нужный вам документ с помощью Invoke-WebRequest и подаёте результат на вход Select-String
    Ответ написан
  • Как добавить ассоциацию ссылки с передачей переменной в Windows?

    @MaxKozlov Куратор тега PowerShell
    kijyra, Судя по всему, решается только через доп. файлики
    VBS будет чуть лучше, потому что не создаёт мелькания окошек.
    на CMD будет проще всего
    set a=%1%
    echo %a:~7,-1%
    pause
    вот тут уже видно, что в a всё вырезано, можно запускать вместо echo

    всё, по которому судя:
    https://superuser.com/questions/1562522/command-li...
    https://superuser.com/questions/136838/which-speci...
    Ответ написан
    Комментировать
  • Как исправить скрипт для вывода статистики по квотам exchange?

    @MaxKozlov Куратор тега PowerShell
    Ну, судя по скрипту, вы не передали ему значение $QuotaIfVal в параметрах
    Больше там на ноль делить негде

    И оно прекрасно работает на 2019
    Ответ написан
    5 комментариев
  • Как из file.txt убрать строки в которых есть слова из последнего поля exlude-list.txt и ...?

    @MaxKozlov Куратор тега PowerShell
    Идею можно взять из этого ответа
    https://qna.habr.com/q/1040648
    Только ваша задача противоположная
    Ответ написан
  • Как скопировать файл с компьютера в Azure Linux Сервер?

    @MaxKozlov Куратор тега PowerShell
    гулите sftp - и к PS это отношения не имеет
    scp ещё можно, если только один файл

    а если именно powershell - то модуль Posh-SSH
    Ответ написан
    Комментировать
  • Почему неправильно парсится файл на микротик?

    @MaxKozlov
    Как-то вы очень уж сложно парсите.

    скрипт как функция. в отдельном файлике
    ########## 
    #  Input: file name
    
    :local fn $1
    #:local fn "text.txt"
    
    :local content [/file get $fn contents]
    :local datalen [:len $content]
    :local fi 0
    :local idx 0
    :local res [:toarray ""]
    
    #:put $datalen
    
    do {
      :local cr [:find $content "\n" $fi]
      if ([:typeof $cr] = "nil") do={
        :set cr $datalen
      }
    #  :put "fi: $fi, cr: $cr, idx: $idx"
      :local line [:pick $content $fi $cr]
    #  :put $line
      :set ($res->$idx) $line
      :set fi ($cr + 1)
      :set idx ($idx + 1)
    } while ($fi <= $datalen)
    
    :return $res


    Использовать
    :local file2array [:parse [/system script get func_file2array source]]; local lines [$file2array text.txt]; :foreach i in=$lines do={ :put $i }


    Ну или всё в один скрипт запихнуть

    p.s. а ошибка, наверное, где-то в районе :set lineEnd [:find $content "\n" $lastEnd ] ;
    если ничего не нашлось, в переменную пишется nil, а тут никакой проверки на это и следующий поиск сначала начинается. зато есть странная проверка :if ( [ :len $content ] = 0 ) do={
    Ответ написан
    2 комментария
  • Как получить список пользователей которые входили на компьютер?

    @MaxKozlov Куратор тега PowerShell
    Парсить Security Event Log на соответствующем компе

    event-4648
    event-4647

    event-4624
    event-4634

    типа
    [DateTime]$StartDate = '2023-05-11'
    [DateTime]$EndDate = '2023-05-12'
    $ComputerName= 'targetcomputer'
    
    $params = @{
      ComputerName=$ComputerName
    	FilterXml = '<QueryList>
    	  <Query Id="0" Path="Security">
            <Select Path="Security">*[System[(EventID=4647 or EventID=4648) and
            TimeCreated[@SystemTime&gt;='''+
            $StartDate.ToUniversalTime().ToString('u').Replace(' ','T') + ''' and 
            @SystemTime&lt;'''+
            $EndDate.ToUniversalTime().ToString('u').Replace(' ','T')+ ''']]]
            </Select>
    	  </Query>
    	</QueryList>'
    }
    $e = Get-WinEvent @params
    
    # Ну и тут потом анализировать $e
    Ответ написан
    3 комментария
  • Как выключить 3par через PS?

    @MaxKozlov Куратор тега PowerShell
    это надо посмотреть что умеет shutdownsys
    может у него есть --force или типа того

    А может, раз вы ShellStream используете, подойдёт
    "echo y | shutdownsys halt"
    Ответ написан
    Комментировать
  • Как вычислить вчерашнюю и позавчерашнюю дату в mikrotik?

    @MaxKozlov
    Есть такие скриптики
    func_date2days - count days from base to given date.

    ########## func_date2days - count days from base to given date. 
    #  Input: two dates like "jan/1/2017"
    ########## uncomment for testing
    :local date $1
    #:local date "sep/13/2017"
    #:put $date
    
    # Base MUST BE lower of any given date. Mikrotik counts from jan/01/1970. 
    #correct only for years>1918
    :local base 1970
    
    ########################################
    :local mdays  {31;28;31;30;31;30;31;31;30;31;30;31}
    :local months {"jan"=1;"feb"=2;"mar"=3;"apr"=4;"may"=5;"jun"=6;"jul"=7;"aug"=8;"sep"=9;"oct"=10;"nov"=11;"dec"=12}
    
    #date 
    :local dd  [:tonum [:pick $date 4 6]]
    :local yy [:tonum [:pick $date 7 11]]
    :local mm [:pick $date 0 3]
    :set mm ($months->$mm)
    
    #0. We have dd/mm/yy
    :local res 0
    
    #1. Move to 01/mm/yy
    :set res ($res+$dd-1)
    
    #2. Move to 01/01/yy
    :while ($mm>1) do={
      :set mm ($mm-1)
      :local dm [:pick $mdays ($mm-1)]
      :if ($mm=2 && (($yy&3=0 && $yy/100*100 != $yy) || $yy/400*400=$yy) ) do={ :set dm 29 }
      :set res ($res+$dm)
    }
    
    #3. Move to 01/01/1900
    :while ($yy>$base) do={
      :set yy ($yy-1)
      :set res ($res+365)
      :if (  ( ($yy&3=0) && ($yy/100*100 != $yy)) || $yy/400*400=$yy ) do={
       :set res ($res+1)
      }
    }
    :return $res


    func_days2date - convert days from base to date string

    ########## func_days2date - convert days from base to date string
    #  Input: days like 18762 (may/15/2021)
    ########## uncomment for testing
    
    :local days $1
    
    #:local days 789
    #:put $days
    
    #days starts from 1
    :set days ($days + 1)
    
    # Base MUST BE lower of any given date. Mikrotik counts from jan/01/1970. 
    #correct only for years>1918
    :local base 1970
    
    ########################################
    :local mdays  {31;28;31;30;31;30;31;31;30;31;30;31}
    :local months {1="jan";2="feb";3="mar";4="apr";5="may";6="jun";7="jul";8="aug";9="sep";10="oct";11="nov";12="dec"}
    
    #date 
    :local yy $base
    :local mm 0
    # base year is not leap
    :local daydiff 365
    :local isleap false
    
    #1. Move to 01/01/yy
    :while ($days > $daydiff) do={
      :set days ($days - $daydiff)
      :set yy ($yy + 1)
      :if (  ( ($yy & 3 = 0) && ($yy/100*100 != $yy)) || $yy/400*400=$yy ) do={
        :set daydiff 366
        :set isleap true
    #    :put "adjust: $yy, days: $days"
      } else={
        :set daydiff 365
        :set isleap false
      }
    #  :put "yy: $yy, days: $days"
    }
    
    #2. Adjust feb 29 if leap year
    #:put "mmm: $mm, days: $days, isleap: $isleap"
    :if ($isleap) do={
    #  :put "adjust month days"
      :set ($mdays->1) 29
    }
    
    #3. Move to 01/mm/yy
    :while ($days > $mdays->$mm) do={
    #  :put ($mdays->$mm)
      :set days ($days-($mdays->$mm))
      :set mm ($mm + 1)
    #  :put "mm: $mm, days: $days"
    }
    
    :local month [:tostr ($mm + 1)]
    :set month ($months->$month)
    :if ($days < 10) do={ :set days ("0".(:tostr $days)) } else={ :set days (:tostr $days) }
    :local res "$month/$days/$yy"
    
    #:put $res
    :return $res


    Первый где-то наковырял, второй понадобился, сам нарисовал :)
    Можно совместить и использовать
    :local date2days [:parse [/system script get func_date2days source]]; :local today "may/12/2023"; :local days [$date2days $today]; :put $days; 
    :local days2date [:parse [/system script get func_days2date source]]; :put [$days2date ($days-1)]
    Ответ написан
    2 комментария
  • Как сделать цикл в PowerShell с условием срабатывания?

    @MaxKozlov Куратор тега PowerShell
    Если оно вам показывает при выводе не то, что на самом деле, значит оно не работает.
    К сожалению, с температурными датчиками у МС не складывается.
    А если таки заработает, или найдёте другой способ получения температуры,
    то вы должны в цикле мониторить, записывать предыдущее значение в отдельную переменную и слать оповещение только когда следующее измерение перейдёт "порог" туда или обратно
    типа
    $border = 40
    $prev_temp = Get-Temperature 
    do {
      $cur_temp = Get-Temperature 
      if (
           ($cur_temp -lt $border -and $prev_temp -gt $border) -or
           ($cur_temp -gt $border -and $prev_temp -lt $border)
         )
      {
         Send-Notification $prev_temp $cur_temp
      }
      $prev_temp = $cur_temp
      Start-Sleep -Seconds 60
    } while ($true)

    Пример, естественно, для одного значения, а не массива
    Ответ написан
    Комментировать