• Почему парсер то работает то нет?

    @MaxKozlov
    Для начала вы можете записать в файл то, что находится в source, и сравнить между собой успешный и неуспешный запуск
    ...
    Судя по наличию в неуспешном ответе "SmartCaptcha", вас распознают как робота.

    Увеличиваем таймауты, маскируемся всячески.
    Ответ написан
    Комментировать
  • Как в терминале реализовано перемещение курсора?

    @MaxKozlov Куратор тега PowerShell
    А теперь вопрос, правильно ли я понимаю, что при вводе например первого символа f из foobar фактически в powershell вводятся следующая последовательность: \b\b\b\bfhey1 ?

    Нет, вы неправильно понимаете.
    В powershell(а, точнее, в поток) уйдёт чистая строка. все перемещения курсора и тд не имеют никакого отношения к потокам ввода\вывода.
    В поток введённые данные отправятся после enter.
    Командная строка(терминал) - это куда более сложная сущность, чем просто комбинация потоков ввода и вывода.
    а конкретно в powershell это ещё и разбавляется встроенным модулем подсветки синтаксиса PSReadline

    P.S.
    И, если уж быть полностью корректным, то Write-Host - это именно вывод в хост(терминал), чисто в поток вывода powershell оно не попадает. Для вывода в поток есть Write-Output. А то, что вывел Write-Host, попадает в поток вывода, который вы, например, можете записать в файл, уже из терминала.

    Попробуйте в консоли Powershell:
    PS D:\> Write-Host 'tohost' > d:\111
    tohost
    PS D:\> Get-Content d:\111
    PS D:\> Write-Output 'tooutput' > d:\111
    PS D:\> Get-Content d:\111
    tooutput
    PS D:\>

    Разницу замечаете ?

    А теперь сравните результат с
    Powershell -Noprofile -Command "Write-Host 'tohost'; Write-Output 'tooutput' " > D:\111
    Powershell -Noprofile -Command "Get-Content d:\111"

    hint: полностью вывод попадает в файл только в последнем примере
    Ответ написан
    Комментировать
  • Как добавить отображения владельца, группы и прав сессий NetBox?

    @MaxKozlov
    Там кастомные колонки. Поэкспериментируйте с C0-C1-C2
    С0 - Группа
    C1 - Права
    С2 - Права цифрами

    Заголовки, правда, не знаю, как поставить
    Ответ написан
    1 комментарий
  • Как из Python отдать команды в PowerShell от имени администратора?

    @MaxKozlov Куратор тега PowerShell
    Вот тут есть метод запуска самого себя из под админа
    https://stackoverflow.com/a/41930586

    import ctypes, sys
    
    def is_admin():
        try:
            return ctypes.windll.shell32.IsUserAnAdmin()
        except:
            return False
    
    if is_admin():
        # Code of your program here
        print("I'm admin")
        input()
    else:
        # Re-run the program with admin rights
        ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)

    Берём отсюда последнюю строчку и вместо sys.executable ставим slmgr.vbs и тд
    или можно вместо 'i'm admin' вставить
    ctypes.windll.shell32.ShellExecuteW(None, "", "slmgr.vbs", "/ipk W269N-WFGWX-YVC9B-4J6C9-T83GX", None, 1)
    Ответ написан
    Комментировать
  • Как посмотреть, где лежит архивная копия базы данных?

    @MaxKozlov Куратор тега PowerShell
    Гугл подсказывает что примерно так
    foreach ($DatabaseName in $MyBase.Name) {
    
      $BackupPath = $smoserver.Databases['msdb'].ExecuteWithResults("SELECT TOP 1 backupmediafamily.physical_device_name FROM backupset JOIN backupmediafamily ON backupset.media_set_id = backupmediafamily.media_set_id WHERE backupset.database_name = '$($DatabaseName)' ORDER BY backupset.backup_start_date DESC")
    
      $BackupPath.Tables[0].physical_device_name
    }

    Может можно и оптимизировать, но, эти данные не привязаны к базе, а лежат именно в msdb
    Ответ написан
    Комментировать
  • Возможно ли автоматизировать такой ряд действий?

    @MaxKozlov Куратор тега PowerShell
    Приложения есть, например https://www.displayfusion.com/
    https://www.nirsoft.net/utils/multi_monitor_tool.html
    А встроенных возможностей нет
    Но, честно говоря, мне кажется, запустить нужное приложение и нажать Win+Up, Win+Shift+(Left/Right) не очень долго.
    Ответ написан
    Комментировать
  • Как проверить подключение к sql через powershell?

    @MaxKozlov Куратор тега PowerShell
    Записать результат как и в любом другом языке присвоение переменной
    Test-SqlConnection бы ещё посмотреть,
    впрочем, если оно с SO, например ( то, которое попроще, про return $true), то записать результат

    $result = Test-SQLConnection "Data Source=base;database=name;User ID=sa;Password=password;"
    #так там будет true/false
    New-Item -Path "C:\TbKassa\Bin" -Name "marker.txt" -ItemType "file" -Value $result -Force
    #а так - 1/0
    New-Item -Path "C:\TbKassa\Bin" -Name "marker.txt" -ItemType "file" -Value ([int]$result) -Force


    Ваша логика рвётся тут if $u = ( $true) { должно быть if ($u -eq $true) { или просто if ($u) {
    ну и в $u присвоить результат
    Ответ написан
    Комментировать
  • Как написать BAT/CMD скрипт на очистку temp файлов в определенных директориях, при этом внутри темп оставить еще 3 нужные папки?

    @MaxKozlov
    Для powershell типа того
    $no_remove = 'dir1', 'dir2', 'dir3'
    $path = 'c:\temp'
    Get-ChildItem $path | Where-Object { $_.Name -notin $no_remove } | Remove-Item -Force -Recurse -WhatIf

    Это удалит всё по пути $path, кроме объектов, названия которых указаны в списке $no_remove
    Если надо убедиться что это обязаны быть папки, можно изменить условие на
    $_.Name -notin $no_remove -and 'Directory' -in $_.Attributes


    Когда натренируетесь, -WhatIf убрать
    Ответ написан
  • Как красиво объединить все значения в строках из второго столбца из CSV файла, если значение в первом столбце совпадает?

    @MaxKozlov Куратор тега PowerShell
    По-моему самое простое и изящное - Group-Object
    $csv = Import-Csv ....
    foreach ($group in ($csv | Group-Object -Property ComputerName)) {
      $computerName = $group.Name
      $data = $group.Group # Оригинальные объекты.  Тут всегда массив, даже если из одного элемента
      #....
    }
    Ответ написан
    Комментировать
  • Сохраняя страничку в html файл появляются?

    @MaxKozlov
    Видимо, потому что в видео сидят под линуксом, а ты под виндой.
    Дефолтная кодировка для файлов разная. Её лучше всегда указывать.
    Хорошенько погуглить тему кодировок.

    p.s. И поучиться вопросы формулировать понятнее.
    Ответ написан
    2 комментария
  • Как открыть доступ к папке?

    @MaxKozlov Куратор тега PowerShell
    Во первых, кроме прав на диск, есть права на шару, на системную шару с правами туго.
    Во вторых, для такого простого скрипта копирования вам хватит robocopy, оно ещё и побыстрее будет

    Создаёте на первом сервере шару Backup$ - даёте на неё (на шару) права своей сервисной учётке.
    и robocopy с /MAXAGE копируете

    Можно, если хочется и скрипт оставить, но шару надо сделать
    Ответ написан
    Комментировать
  • Что не так с тонким диском в esxi 6.7?

    @MaxKozlov
    Вы не туда смотрите. Смотрите на свободное место.

    Это "разреженные" (sparse) файлы

    > df
    Filesystem      Available    Mounted on
    NFS         8713914531840     /vmfs/volumes/Store

    PS > New-HardDisk -VM MyVM -CapacityGB 100 -Datastore Store

    > ls /vmfs/volumes/Store/MyVM/*flat.vmdk -la
    107374182400 Dec  9 07:32 /vmfs/volumes/Store/MyVM/MyVM_1-flat.vmdk
    
    > df
    Filesystem      Available    Mounted on
    NFS         8713914527744     /vmfs/volumes/Store

    PS > 8713914531840 - 8713914527744
    4096

    100GB размер, а занятого места 4 килобайта
    Ответ написан
    3 комментария
  • Как отредактировать csv файл с помощью powershell?

    @MaxKozlov Куратор тега PowerShell
    Стоит проверить что именно у вас долгое
    Import-csv вы никак не ускорите.
    А вот $dataColl - реальный кандидат на ускорение
    Проще всего использовать ArrayList вместо массива
    ...
    $dataColl = New-Object System.Collections.ArrayList
    foreach  ($Path in $Paths){
    ....
        [void]$dataColl.Add($dataObject)
      }
    }
    ...


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

    Measure-Command { $a = @(); 1..1000 | %{ $a += $_ } }
    
        TotalMilliseconds : 40,3721
    
    Measure-Command { $a = New-Object System.Collections.ArrayList; 1..1000 | %{ [void]$a.Add($_) } }
    
        TotalMilliseconds : 18,5863
    
    # А для 10000 уже
       TotalMilliseconds : 2016,3737
      vs
       TotalMilliseconds : 57,6177


    p.s. Кстати да, Роман Безруков верно заметил, что новый массив создавать вообще не обязательно. Но информация выше сильно влияет на работу, так что оставлю :)
    Ответ написан
    Комментировать
  • Как заменить старые файлы сравнивая их хэш и время создания?

    @MaxKozlov Куратор тега PowerShell
    Используете Compare-Object и Where-Object
    $oldfile = Get-FileHash .\old\*
    $newfile = Get-FileHash .\new\*
    Compare-Object $oldfile $newfile -Property Hash -PassThru | 
       Where-Object { $_.SideIndicator -eq '<='  } |
       Foreach-Object { Copy-Item $_.Path  -Destination $Destination }

    Не знаю что и куда вам копировать, поэтому в примере, может быть, придётся поменять условие при SideIndicator

    Для рекурсивного сравнения надо сбор хешей сделать рекурсивным :)
    $oldfile =  Get-ChildItem .\old\*  -Recurse | Get-FileHash
    $newfile = Get-ChildItem .\new\* -Recurse | Get-FileHash
    Ответ написан
    4 комментария
  • Как добавить кнопку Inline Keyboard в Телеграм вторым рядом, используя PowerShell?

    @MaxKozlov Куратор тега PowerShell
    если я правильно понимаю, вам надо передавать кнопки по строкам
    ..
    $row1 = @($buttonsubcheck, $buttonsubtrial)
    $row2 = @($buttonsubback)
    $buttonssub = ($row1, $row2)
    ..
    Ответ написан
  • Как можно в фоне отслеживать новые открываемые TCP подключения с помощью Powershell?

    @MaxKozlov Куратор тега PowerShell
    Судя по наличию соотвествующего события, отследить можно.
    Можно подписаться на это событие
    https://theposhwolf.com/howtos/PowerShell-On-Windo...
    https://stackoverflow.com/questions/36551151/how-t...
    И обрабатывать его наступление

    Ну или в цикле вызывать Get-NetTCPConnection
    И сравнивать с предыдущим списком с помощью Compare-Object
    Ответ написан
    1 комментарий
  • Как узнать пользователей, группы удаленного рабочего стола через powershell?

    @MaxKozlov Куратор тега PowerShell
    Я смотрю, вы не пошли по пути remote execution и вам хочется боли ? :)

    Тогда вот, берегите глаза
    $Computername = 'xxx'
    Get-CimInstance Win32_Group -filter "LocalAccount='True' and SID='S-1-5-32-555'" -ComputerName $Computername |
    Select-Object PSComputername,Name,@{Name="Members";Expression={
      (Get-CimAssociatedInstance -InputObject $_ -ResultClassName Win32_UserAccount).Name
    }}

    или в переводе на WMI
    $Computername = 'xxx'
    Get-WMIObject Win32_Group -filter "LocalAccount='True'and SID='S-1-5-32-555'" -ComputerName $Computername|
      Select-Object PSComputername,Name,@{Name="Members";Expression={
       $_.GetRelated("Win32_UserAccount").Name
    }}


    Здесь будут только пользователи. Для вложенных групп надо ещё подкрутить :)
    Upd:
    Ладно, не буду больше томить, нашёл альтернативный вариант
    Во времена PSv2 ещё написал, когда не было встроенной

    function Get-LocalGroupMember {
    param(
    	[Parameter(ValueFromPipeline=$false, Position=0)]
    	[string[]]$GroupName = 'Administrators',
    	[Parameter(ValueFromPipeline=$true)]
    	[string[]]$ComputerName = '.'
    )
    PROCESS {
    	foreach ($computer in $ComputerName) {
    		foreach ($group in $GroupName) {
    			$grp = [ADSI]"WinNT://$computer/$group,group"
    			Write-Verbose ('Group: ' + $grp.Path) # test for existance
    			$members = @($grp.psbase.Invoke("Members"))
    			if ($members) {
    				$members | Foreach-Object {
    					$name = $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)
    					$class = $_.GetType().InvokeMember("Class", 'GetProperty', $null, $_, $null)
    					$parent = $_.GetType().InvokeMember("Parent", 'GetProperty', $null, $_, $null) -replace 'WinNT://' -replace '.*/'
    					'' | Select-Object @{n='Class';e={$class}},@{n='Domain';e={$parent}},@{n='Name';e={$name}}
    				}
    			}
    		}
    	}
    }
    }

    Только надо ещё знать имя группы, а оно может быть как на русском, так и на английском
    Пользоваться можно так, на один из вариантов ругнётся, по второму выдаст инфу

    Get-LocalGroupMember -ComputerName MySuperServer -GroupName 'Пользователи удаленного рабочего стола',  'Remote Desktop Users'
    Ответ написан
    2 комментария
  • Как перемещать файлы с заданными характеристиками?

    @MaxKozlov Куратор тега PowerShell
    Избавляться надо от ненужных преобразований типа $Paths = $Paths.FullName
    От вложенного цикла надо избавляться. N^2 однако. Если он там, конечно есть
    Так как нет примера того что у вас в csv, непонятно зачем он нужен вообще
    по тексту у вас вроде как во внешнем $Path должна быть уже просто строка
    Почему вы её ещё раз перебираете как foreach ( $Newpath in $Path) ?

    Ну и мувать с -Exclude *.xl* тоже странно, проще проверить на xl* в коде, чем заставлять этим заниматься move-item. Может быть, вы ps заставляете по новой весь каталог обшаривать таким образом, а в нём 10000 файлов xls

    Плюс, логи на каждый мув могут вас тормозить

    -Passthru на move-item излишен, он может заставлять по новой читать параметры файла с диска, а вам от него нужен только новый полный путь, который вы и так знаете

    А вообще я бы каталоги целиком таскал, по крайней мере на первом проходе.
    Судя по количеству ваших файлов, там большущая помойка.
    Ответ написан
    Комментировать
  • Как изменить уровень яркости?

    @MaxKozlov
    Вот такая ещё есть штука, чуть более низкоуровневая, чем Monitorian, зато малюсенькая
    С командной строкой дружит
    ControlMyMonitor от NirSoft
    Ответ написан
    Комментировать
  • Как через powershell задать программу во вкладке среда пользователя AD?

    @MaxKozlov Куратор тега PowerShell
    Содержимое этой вкладки зашифровано в атрибуте
    userParameters
    Расшифровывать/Зашифровывать его муторно, поэтому если вам надо просто устанавливать его всем одинаковым, проще один раз его заполнить вручную, потом считать из AD, записать результат в файлик и впоследствии просто из файлика его присваивать. Или из другого юзера, как в примере.
    $referenceUser = Get-ADUser refuser -Property userParameters
    Set-ADUser targetUser -Replace @{
        userParameters = $referenceUser.userParameters
    }


    Для New-ADUser можно использовать -OtherAttributes
    Ответ написан
    2 комментария