Задать вопрос
  • Как правильно проверить возврат функции?

    @MaxKozlov Куратор тега PowerShell
    потому что первый IF должен выглядеть как
    if ((TestPath $pathToProjectFile) -eq $false) {
    В Powershell надо весь вызов брать в скобки, а не аргументы
    ваши "-eq $false" становятся длполнительными аргументами функции, а не операторами сравнения
    В этом можно убедиться, если вашу функцию записать как
    function TestPath($Path) {
        Write-Host -fore Green "Args: $args"
        return (Test-Path -Path $Path -PathType leaf)
    }

    И тогда вы увидите
    Args: -eq False
    Зелёного цвета
    Ответ написан
  • Powershell+XML. Как привести блок XML из одного файла к виду другого файла?

    @MaxKozlov Куратор тега PowerShell
    Совершенно непонятно что имеется ввиду под "....но разные контролы и надо привести их к общему виду."
    Имеется ввиду порядок элементов "FieldName", номера Label или ещё что-то ?

    Или надо полностью заменить содержимое Group ?
    Например так
    $x1 = [xml]$xml1
    $x2 = [xml]$xml2
    $x2.FORM.Group.InnerXml = $x1.FORM.Group.InnerXml
    ?
    Ответ написан
    Комментировать
  • Генерация случайного списка в Powershell?

    @MaxKozlov Куратор тега PowerShell
    Учитывая, что это все-таки powershell, а не basic, я бы написал так:
    # Сразу используем массив, а не строку - можно обойтись без деления на части
    $ComputerList = "PC1", "PC2", "PC3", "PC4", "PC5", "PC6", "PC7", "PC8", "PC9", "PC10"
    Write-Host -ForegroundColor Magenta "Количество компьютеров:" $ComputerList.Length
    
    # Get-Random Умеет сам выбирать нужное количество элементов, поданных на вход
    # к тому же он выдаёт гарантированно неповторяющиеся элементы, ваш вариант потенциально может выдать, например, два пятых компа
    $NewList = $ComputerList | Get-Random -Count 5
    
    Write-Host -ForegroundColor Green "Количество новых компьютеров:" $newList.Length
    Write-Host -ForegroundColor Red "Список новых компьютеров:" $newList
    Ответ написан
    1 комментарий
  • Как при помощи Powershell отправить файл своему боту в Telegram Bot API?

    @MaxKozlov Куратор тега PowerShell
    у Windows Powershell нет прямой поддержки 'multipart/form-data', только у Core

    В частности для multipart не хватает указания bondary в ContentType
    Можете попробовать поэкспериментировать с ручной сборкой типа как тут @jklemmack
    https://stackoverflow.com/questions/36268925/power...
    или с System.Net.Http.MultipartFormDataContent
    Ответ написан
    6 комментариев
  • Как использовать MySQL .NET Connector в Powershell?

    @MaxKozlov Куратор тега PowerShell
    Windows 7, установлен Net Framework 4.7
    $psversiontable.psversion показывает что у меня 2ая версия powershell


    PSv2 основан на .Net2 - потому и сборка не загружается

    только устанавливать новый PS
    ну или искать версию библиотеки под Net2
    Ответ написан
  • Как активировать окно exe программы и нажать на кнопку?

    @MaxKozlov Куратор тега PowerShell
    Пример посылания кнопочки F1 в окошко Visoal Studio Code с помощью PowerShell

    Для работы напрямую с оконным API Windows используется модуль
    https://github.com/MVKozlov/Powershell-WindowHelper

    Надо его скачать и положить или в папку "C:\Program Files\WindowsPowerShell\Modules\WindowHelper"
    или в "C:\Users\%Username%\Documents\WindowsPowerShell\Modules\WindowHelper"

    # Тут можно импортировать модуль напрямую, если не класть его по вышеуказанным путям
    #Import-Module C:\Path\To\Module\WindowHelper.psm1
    # Или просто импортировать, если есть в путях (необязательно)
    #Import-Module WindowHelper
    
    # Импортируем типы для использования SendKeys
    Add-Type -AssemblyName System.Windows.Forms
    
    # Ищем среди всех окон окно с нужным заголовком
    $w = Get-ChildWindows | ? { $_.Text -eq 'Visual Studio Code' }
    # Клавиши, которые нужно нажимать
    # Брать отсюда - https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.forms.sendkeys
    $KeySequence = '{F1}'
    # Активируем нужное окно
    Set-ForegroundWindow $w.Handle
    # Небольшая задержка
    Start-Sleep -Milliseconds 100
    # Посылаем клавиши
    [System.Windows.Forms.SendKeys]::SendWait($KeySequence)


    P.S. В процессе подготовки вспомнил, что процесс и powershell должны быть в одном контексте - специально из под админа запускать не надо
    Ответ написан
  • Как в Ansible убрать кракозябры при выводе stdout?

    @MaxKozlov
    Нашёл пару вариантов решения корректного вывода VBS
    К сожалению, оба варианта с промежуточным выводом в файл

    - name: Information about license for Windows
          win_shell: |
            # variant 1
            Start-Process -Wait -RedirectStandardOutput C:\111 -FilePath cscript -ArgumentList 'slmgr.vbs','-dlv'
            Get-Content C:\111 -Encoding OEM
    
            # variant 2
            [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("cp866")
            cscript slmgr.vbs -dlv > c:\222
            Get-Content C:\222 -Encoding Unicode
          register: infowin_out
          args:
            chdir: '{{ ansible_env.windir }}\System32\'
            no_profile: yes
    
        - debug: var=infowin_out
    Ответ написан
    Комментировать
  • Как реализовать поиск в многоуровневой хеш таблице?

    @MaxKozlov Куратор тега PowerShell
    Без поддержки массивов когда-то писал для себя вот такую рекурсивную функцию
    function Get-ObjectValue($Object, $PropertyName) {
      $property, $remain  = $PropertyName -split '\.',2
      if ($remain) {
        Get-ObjectValue $Object.$property $remain
      }
      else {
        $Object.$property
      }
    }


    Массив надо допиливать
    Ответ написан
    Комментировать
  • [PowerShell] Как отправить СМС в кириллице через GSM модем?

    @MaxKozlov Куратор тега PowerShell
    С модемами и СМС не работал, но
    попробовать поэкспериментировать с перекодированием сообщения перед отправкой можно с помощью таких функций

    function Get-TextEncoding ($Encoding) {
    		switch -regex ($Encoding) {
    			'default' {
    				[System.Text.Encoding]::Default
    			}
    			'utf8' {
    				[System.Text.Encoding]::UTF8
    			}
    			'oem' {
    				[System.Text.Encoding]::GetEncoding(
    					(Get-Culture).TextInfo.OEMCodePage
    				)
    			}
    			'ansi' {
    				[System.Text.Encoding]::GetEncoding(
    					(Get-Culture).TextInfo.ANSICodePage
    				)
    			}
    			'^\d+$' {
    				[System.Text.Encoding]::GetEncoding([int]$Encoding)
    			}
    			default {
    				[System.Text.Encoding]::GetEncoding($Encoding)
    			}
    		}
    }
    function Convert-TextEncoding {
    param (
    	[Parameter(ValueFromPipeline=$true,Position=0)]
    	[String[]]$InputObject,
    	[Parameter(Mandatory=$true,Position=1)]
    	[string]$FromEncoding,
    	[Parameter(Mandatory=$true,Position=2)]
    	[string]$ToEncoding
    )
    BEGIN {
    	try {
    		$FE = Get-TextEncoding $FromEncoding
    		$TE = Get-TextEncoding $ToEncoding
    	}
    	catch {
    		throw
    	}
    }
    PROCESS{
    	foreach ($s in $InputObject) {
    		if ($s) {
    			$TE.GetString($FE.GetBytes($s))
    		}
    		else {
    			$s
    		}
    	}
    }
    }
    # Например, читабельный вывод из удалённо выполняемых консольных приложений я получаю так:
    # Invoke-Command -ComputerName remoteComp { dism /online } | Convert-TextEncoding -FromEncoding 1251 -ToEncoding 866
    Ответ написан
    Комментировать
  • Ansible. Как в модуле использовать еще один модуль?

    @MaxKozlov
    можно попробовать использовать block
    или вложенные include_tasks

    А если нет требования, чтобы выходной файл пополнялся сразу после выполнения, то register на цикл создаёт массив данных, который в конце можно и записывать
    Ответ написан
    Комментировать
  • Как перезапустить службу от имени администратора?

    @MaxKozlov Куратор тега PowerShell
    Не получилось потому, что новый процесс стартовал из под другого пользователя, но не с правами админа

    Можно запускать цепочкой. типа

    $credential = Get-Credential domain\Admin
    #Сначала другим пользователем, а потом им же, но с повышенными правами
    Start-Process -Credential $credential -FilePath powershell -ArgumentList "Start-Process -Verb runAs -FilePath powershell -ArgumentList 'Get-Service winrm; read-host'"
    Ответ написан
  • Как в PS перемещаться стрелками?

    @MaxKozlov Куратор тега PowerShell
    Что-то типа того ?
    function ShowMenu([array]$Menu, [int]$Default)
    {
      $minY = [Console]::CursorTop
      $y = [Math]::Max([Math]::Min($Default, $Menu.Count), 0)
      do {
        [Console]::CursorTop = $minY
        [Console]::CursorLeft = 0
        $i = 0
        foreach ($item in $Menu) {
          $colors = @{
             BackgroundColor = if ($i -ne $y) { [Console]::BackgroundColor } else { 'Cyan' }
             ForegroundColor = if ($i -ne $y) { [Console]::ForegroundColor } else {' Blue' }
          }
          Write-Host (' {0}. {1} ' -f ($i+1), $item) @colors
          $i++
        }
        $k = [Console]::ReadKey()
        switch ($k.Key) {
          'UpArrow' { if ($y -gt 0) { $y-- } }
          'DownArrow' { if ($y -lt ($menu.Count - 1)) { $y++ } }
          'Enter' { return $Menu[$y] }
        }
      } while ($k.Key -notin ([ConsoleKey]::Escape, [ConsoleKey]::Enter))
    }
    
    $Menu = 'test1','text2','menu3','result4'
    
    ShowMenu $menu 2


    Реакцию на другие кнопочки можно доработать по вкусу
    Ответ написан
    1 комментарий
  • Как поменять Имя которое отображается в AD через PowerShell?

    @MaxKozlov Куратор тега PowerShell
    Rename-ADObject меняет атрибут CN - то есть то, что отображается в списке
    Соответственно и DistinguishedName
    а DisplayName (Выводимое имя) ставится Set-ADUser -DisplayName
    Если же нужно просто Имя, то это GivenName

    DistinguishedName : CN=Чебуракин Геннадий Шапоклякович,OU=SOME_OU,DC=forma,DC=com
    CN : Чебуракин Геннадий Шапоклякович
    DisplayName : Чебуракин Геннадий Шапоклякович
    Name : Чебуракин Геннадий Шапоклякович
    Surname : Чебуракин
    GivenName : Геннадий
    Ответ написан
    Комментировать
  • Как с помощью скрипта изменить программу при запуске терминальной сессии?

    @MaxKozlov Куратор тега PowerShell
    Get-ADUser -filter "samAccountName -like '*env'" | Set-ADUser -ScriptPath "somescriptname"
    Get-ADGroupMember somegroupname | Set-ADUser -ScriptPath "somescriptname"


    Нашёл.
    По мотивам https://devblogs.microsoft.com/scripting/hey-scrip...

    $user = [ADSI]"LDAP://$($user_DistinguishedName)"
    #read
    #$user.psbase.InvokeGet('TerminalServicesInitialProgram')
    #write
    $user.psbase.InvokeSet('TerminalServicesInitialProgram', 'cmd.exe')
    $user.SetInfo()


    Это пусть тоже тут побудет
    https://stackoverflow.com/questions/27814791/how-t...
    список всех параметров
    https://docs.microsoft.com/en-us/openspecs/windows...
    Ответ написан
  • Скрипт убивание процесса?

    @MaxKozlov Куратор тега PowerShell
    Можно сначала записать данные в hashtable
    Get-Process $processname | Foreach-Object { $pslist=@{} } { $pslist[$_.id]=$_.cpu }

    А потом результаты второй выборки сравнивать с первой
    Get-Process $processname | Where-Object { ($_.cpu - $pslist[$_.id])/($numcores*$sleepseconds) * 100 -gt 75  }


    ну и делать с ними что хочется
    Ответ написан
    Комментировать
  • Как определить сколько дней хранится файл в папке (CMD или powershell)?

    @MaxKozlov Куратор тега PowerShell
    Если не привязываться к именам папок, а только ко времени изменения файла
    Get-ChildItem D:\Archive\ -Recurse -File *.mp4 |
      Sort-Object LastWriteTime | 
      Select-Object -First 1 |
      ForEach-Object { (Get-Date) - $_.LastWriteTime }
    Ответ написан
    Комментировать
  • Как осуществить выборку значения из списка по ключу при помощи jinja?

    @MaxKozlov
    Если вы хотите получить только dirs., у которых атрибут type == "es_script"
    то можно так (если, я, конечно, правильно понял задачу)
    set_fact:
      scriptdirs: {{ dirs. | selectattr(type, 'equalto', 'es_script') | list }}
    
    template:
      src: template.j2
      dest: " {{ item.path }}"
      mode: "{{ item.mode }}"
    loop: "{{ scriptdirs }}"
    Ответ написан
    Комментировать
  • Как работает sudo в ansible?

    @MaxKozlov
    Такая ошибка может возникать если у пользователя через sudo есть не все права, а только на запуск определённых команд, ansible создаёт временный файл со своими командами в /tmp и запускает его, а не напрямую /bin/sh
    Ответ написан
    Комментировать
  • Powershell: Относительный адрес в абсолютный?

    @MaxKozlov Куратор тега PowerShell
    Если пути существуют
    (Resolve-Path (Join-Path $path1 $path2)).Path
    Ответ написан
    Комментировать
  • Powershell, что не так с кодировкой в переменной?

    @MaxKozlov Куратор тега PowerShell
    С боььшой вероятностью у вас файл скрипта в колировке utf-8 или utf-16 без BOM. Попробуйте его пересохранить в кодировке utf-8 с BOM или в 1251
    Ответ написан