• Robocopy, копирование с разных хостов на сервер?

    @MaxKozlov Куратор тега PowerShell
    Самое простое в вашем случае, если запускаете сторонним софтом - обычный cmd
    .
    robocopy \\%computername%\c$\logs \\server\logs\%computername%\logs /e


    Если с сервера - powershell
    $computers =get-content 'c:\computers.txt'
    foreach ($computername in $computers) {
      robocopy "\\$computername\c`$\logs" "\\server\logs\$computername\logs" /e
    }

    Можно сделать подобный цикл на cmd через "for/f"
    for /f %%a in (c:\computers.txt) do robocopy \\%%a\c`$\logs \\server\logs\%%a\logs /e
    Ответ написан
    1 комментарий
  • Как в PowerShell преобразовать HEX в Double?

    @MaxKozlov Куратор тега PowerShell
    [System.BitConverter]::ToSingle(@(0xcd,0xcc,0x4c,0x41),0)
    12,8

    Соответственно, смотря откуда берёте данные.
    Если из массива байтов, то как написал выше, если из uint - сначала его предварительно надо тем или иным способом в массив байтов преобразовать. в целом это .net, а не powershell
    Ответ написан
    1 комментарий
  • Как найти ключ с нужным значением в реестре с помощью powershell?

    @MaxKozlov Куратор тега PowerShell
    Where-Object + GetValue()

    $usb = Get-ChildItem -path HKLM:\SYSTEM\ControlSet001\Enum\USB\ -Recurse
    $usb | Where-Object { $_.GetValue('Address') -eq 4 }


    Вообще, если вы используете свежий powershell с модулем PSReadLine, то автодополнение очень помогает

    $usb[1].<Ctrl+Space>
    И разглядываете
    или old-way
    Get-Member -InputObject $usb[1]

    Можно ещё заморочиться с Get-ItemProperty, но это будет сложнее
    Ответ написан
    Комментировать
  • Как передать переменную с локального компа на удаленный в сеанс powershell при выполнении psexec?

    @MaxKozlov Куратор тега PowerShell
    тут скорее зависит от того что у вас там в параметрах
    Что-то простое, типа строки, работает

    $x = 'test'
    psexec \\server powershell -NoProfile -Сommand "write-host '$X'"
    psexec \\server powershell -NoProfile -Command "param(`$a) write-host `$a"  $x

    А вот если там объект, его надо предварительно сериализовать в строку, а на той стороне десериализовать

    Вариант сериализации - Convert-ToJson с последующим упаковыванием в base64

    Может быть даже проще окажется использовать -EncodedCommand
    Ответ написан
  • Powershell - экранирование спецсимволов?

    @MaxKozlov Куратор тега PowerShell
    Честно говоря, живьём не пробовал, но, скорее всего нужно что-то типа того.
    Обратите ещё внимание, что Default в круглых скобках, а вокруг -Command кавычки не нужны

    New-ItemProperty -LiteralPath HKCR:\Microsoft.PowerShellScript.1\Shell\runas\command -Name '(Default)' -Value 'powershell.exe -NoExit -Command "if((Get-ExecutionPolicy ) -ne ''AllSigned'') { Set-ExecutionPolicy -Scope Process Bypass }; & ''%1''"' -PropertyType String -Force | Out-Null;

    Хотя, я не понимаю, зачем это надо :)
    Ответ написан
  • Почему при импорте сертификата в exchange 2013 ругается на неправильный заданный пароль на сертификат?

    @MaxKozlov
    Ну и занесите его в хранилище руками, раз утверждаете что получается
    LocalMachine\My\
    а потом назначите через Enable-ExchangeCertificate

    #А вообще пароль проще запросить
    $cred = get-credential
    #и использовать
    Import-ExchangeCertificate -FileName "C:\mail\mail.pfx" -Password $cred.Password
    Ответ написан
  • Как удаленно установить программу через powershell?

    @MaxKozlov Куратор тега PowerShell
    Enter-PSSession нельзя использовать в скриптах. Это интерактивная команда
    Вам нужно использовать
    Invoke-Command -ComputerName $computer { C:\Temp\Install.exe /S }

    Если выполнять несколько команд, можно создать сессию
    $session = New-PSSession -ComputerName $computer
    Invoke-Command -Session $session { C:\Temp\Install.exe /S }
    Invoke-Command -Session $session { C:\Temp\Install2.exe /S }


    Но тут может быть засада. Некоторые инсталляторы требуют интерактивную сессию

    Тогда придётся извращаться с запуском задачи от имени текущего пользователя, которая и будет выполнять вашу C:\Temp\Install.exe /S
    Ответ написан
    Комментировать
  • Powershell. Как правильно подставить значение переменной в URl адресс?

    @MaxKozlov Куратор тега PowerShell
    Можно просто вместо Select-Object id сделать Select-Object -ExpandProperty id
    Ответ написан
    Комментировать
  • PsExec.exe не удается правильно запустить скрипт?

    @MaxKozlov Куратор тега PowerShell
    о, добрался я таки до нужного компа.
    Как и говорил res2001 в комментариях в пункте 3, это UAC, надо добавить ключик

    psexec -h

    А через PSRemoting оаботает и без того
    Ответ написан
  • Как запустить данный скрипт с ярлыка не вводя каждый раз учетные данные?

    @MaxKozlov Куратор тега PowerShell
    Так как credentials вам нужны фактически только для Invoke-Command
    а у shutdown есть свой ключик для удалённого выключения и перезагрузки, можно заменить
    Invoke-Command на shutdown -m \\$TMP .....
    права на перезагрузку компов у этих пользователей уже должны быть или вам всё равно придётся их дать.

    Если же нужно мутить что-то более сложное, надо смотреть в сторону Register-PSSessionConfiguration

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

    Если же прав на перезагрузку у них нет, но есть у того, чьи credentials вы им "выдаёте" - то это по сути всё равно что им самим выдать, дополнительные "навороты" вокруг этого факта ничего по сути не меняют, так как нажать на ярлык они могут в любой момент
    Ответ написан
    Комментировать
  • Как добавить пользователя в vSphere c ограничениями?

    @MaxKozlov
    Если под "Установлен vsphere соответствующий" вы таки подразумеваете VCenter, то в GUI администрировании есть роли, которые можно назначать в Permissions на хостах

    Если же у вас голые сервера, то на хосте тоже есть Permissions, а создание пользователей и ролей идёт уже из раздела Manage/Users|Roles в GUI
    Ответ написан
  • Как в PowerShell найти файл и проверить на совпадение по дате в его имени?

    @MaxKozlov Куратор тега PowerShell
    Всё что вам было нужно - взять в двойные кавычки - именно в них происходит интерполяция переменных

    $Date = get-date -Format "yyyy-MM-dd"
    Get-ChildItem -Path "I:\BACKUP\File_$Date*.bak"
    # Если непременно надо подчёркивание, то переменную придётся выделить
    # Get-ChildItem -Path "I:\BACKUP\File_$($Date)_*.bak"
    Ответ написан
    Комментировать
  • WinSCP PowerShell, почему меняет названия файла?

    @MaxKozlov Куратор тега PowerShell
    Судя по вот этой страничке,
    настройка должна быть просто Utf
    А вообще по дефолту там Auto - само должно понять, если сервер умеет

    И у меня всё нормально сработало. Возможно, проблема в настройках вашего сервера

    P.S.
    Хотя, может, я не так понял ваш текст и "При переносе файл меняет название с РУС на "символы\буквы"." касается уже Move-Item, а не PutFiles ?
    Ответ написан
    Комментировать
  • Как сохранить обьект в файл?

    @MaxKozlov Куратор тега PowerShell
    Export-Clixml / Import-Clixml
    "Живой" объект не воссоздаст, но все свойства будут доступны

    под "живым" я подразумеваю штуки типа WMI
    Ответ написан
    2 комментария
  • Как произвести замену без регулярных выражений?

    @MaxKozlov Куратор тега PowerShell
    Можно предварительно экранировать символы регулярных выражений перед использоаанием.

    А можно испрользовать метод .replace() для строк
    "Строка в которой будет производится замена".replace("текст, который должен быть заменен", "на что заменен")
    Ответ написан
    Комментировать
  • Неправильно срабатывает условия IF как исправить?

    @MaxKozlov Куратор тега PowerShell
    жудкий синтаксис. позволил себе отформатировать :)
    проверять каждую папочку отдельно и ставить флажок "отправлять"
    а у вас фактически проверяется только последняя папка
    $folders = 'E:\BASE\enm*\pm*','F:\DATE\enm*\pm*'
    $send_mail = $false
    Get-ChildItem -force $folders -ErrorAction SilentlyContinue | Where-Object { $_ -is [io.directoryinfo] } | ForEach-Object {
        $len = 0
        Get-ChildItem -recurse -force $_.fullname -ErrorAction SilentlyContinue | ForEach-Object { $len += $_.length }
        $colors = @{$False='black'; $True='red'}
        $_.fullname+' - ', '<font color="{1}">{0:N2} Gb</font>' -f ($len / 1Gb), $colors[$len -ge 3Gb]
        if ($len -ge 3Gb) {
            $send_mail = $True
        }
    } | Tee-Object -Variable body 
    if ($send_mail)
    {
        Send-MailMessage-From 'test@test.ru' -To 'test@test.ru', -Subject "enm size" -BodyAsHtml ($Body -join "<br>`r`n")  –SmtpServer '10.10.10.10'
    }
    Ответ написан
    Комментировать
  • Как вытянуть значение из файла?

    @MaxKozlov Куратор тега PowerShell
    $c = Get-Content d:\your_file.txt
    
    $c | Foreach-Object -Begin { $data = @{} } -Process { $a = $_ -split ':', 2; if ($a.Length -eq 2) { $data[$a[0].Trim()] = $a[1].Trim() } } -End { [PSCustomObject]$data }


    Результат можно присваивать переменной и потом анализировать/преобразовывать по полям

    $info = $c | ......
    [float]($info.Download -replace 'Mbps.*')
    Ответ написан
    Комментировать
  • Как переимовать процесс Python?

    @MaxKozlov
    Вариант поновее:
    https://pypi.org/project/setproctitle/
    Ответ написан
    Комментировать
  • При конвертации из XML в JSON с помощью PowerShell получаю пустые значения, как исправить?

    @MaxKozlov Куратор тега PowerShell
    Вторая функция рабочая вполне. надо только названия поправить и бОльшую вложенность использовать. у вас там микс из ConvertFrom-Xml и ConvertFrom-Xml2

    PS D:\> $s = '<?xml version="1.0" encoding="utf-8"?>
    >> <Data>
    >>   <Card>
    >>     <Id>123</Id>
    >>     <CreateDate>2022-06-20T21:01:32.7727011+05:00</CreateDate>
    >>     <CardData>
    >>       <Id>456</Id>
    >>       <Value>789</Value>
    >>       <Ord>0</Ord>
    >>     </CardData>
    >>   </Card>
    >> </Data>'
    PS D:\> $xml = [xml]$s
    PS D:\> function ConvertFrom-Xml2 {
    >>   param([parameter(Mandatory, ValueFromPipeline)] [System.Xml.XmlNode] $node)
    >>   process {
    >>     if ($node.DocumentElement) { $node = $node.DocumentElement }
    >>     $oht = [ordered] @{}
    >>     $name = $node.Name
    >>     if ($node.FirstChild -is [system.xml.xmltext]) {
    >>       $oht.$name = $node.FirstChild.InnerText
    >>     } else {
    >>       $oht.$name = New-Object System.Collections.ArrayList
    >>       foreach ($child in $node.ChildNodes) {
    >>         $null = $oht.$name.Add((ConvertFrom-Xml2 $child))
    >>       }
    >>     }
    >>     $oht
    >>   }
    >> }
    PS D:\> $xml | ConvertFrom-Xml2 | ConvertTo-Json -Depth 10
    {
        "Data":  [
                     {
                         "Card":  [
                                      {
                                          "Id":  "123"
                                      },
                                      {
                                          "CreateDate":  "2022-06-20T21:01:32.7727011+05:00"
                                      },
                                      {
                                          "CardData":  [
                                                           {
                                                               "Id":  "456"
                                                           },
                                                           {
                                                               "Value":  "789"
                                                           },
                                                           {
                                                               "Ord":  "0"
                                                           }
                                                       ]
                                      }
                                  ]
                     }
                 ]
    }


    А вообще это всё потому что $xml - это не чистый PS объект, а XmlDocument
    Ответ написан
    1 комментарий
  • Как вывести время в формате больше 24 часов?

    @MaxKozlov Куратор тега PowerShell
    Это проблема не powershell, а c#(.net). Классическая. Отсутствие в формате времени TimeSpan обозначений для Total*

    решается, обычно, форматированием типа
    "{0:00}:{1:mm\:ss\,ff}" -f $sum.TotalHours, $sum
    Ответ написан
    Комментировать