Ответы пользователя по тегу cmd/bat
  • Как исправить проблему с кодировкой?

    @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 $Computer { net user } | 
        Convert-TextEncoding -FromEncoding 1251 -ToEncoding 866
    Ответ написан
    Комментировать
  • Установка Zabbix Agent на большое количество машин Windows без домена?

    @MaxKozlov Куратор тега PowerShell
    Думаю, раз вам от PS ничего особо и не надо, лучше через psexec
    аналог New-NetFirewallRule прекрасно делается через netsh
    К тому же я что-то не уверен, что у вас на Win7 есть, собственно, New-NetFirewallRule
    да и PSv2 внезапно может везде оказаться
    Ответ написан
    Комментировать
  • Как добавить ассоциацию ссылки с передачей переменной в 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...
    Ответ написан
    Комментировать
  • Удаленное управление WinRM?

    @MaxKozlov Куратор тега PowerShell
    Судя по "Stack: 2.0" у вас там powershell v2,
    Для начала поставьте 5.1

    А с кодировкой фигня получается из-за того, что все консольные программы используют не-unicode кодировку

    Обойти можно так, например
    Invoke-Command -ScriptBlock { cmd /c "chcp 65001 && ipconfig /all" } -ComputerName ...


    Минус будет такой, что если у вас сетевое соедниение названо по-русски, оно крокозябрми останется

    Или свой перекодировщик отдельный сделать, которым перекодировать весь вывод после получения
    Ответ написан
    Комментировать
  • Как написать 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 убрать
    Ответ написан
  • Как узнать пользователей, группы удаленного рабочего стола через 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
    Вот такая ещё есть штука, чуть более низкоуровневая, чем Monitorian, зато малюсенькая
    С командной строкой дружит
    ControlMyMonitor от NirSoft
    Ответ написан
    Комментировать
  • 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 комментарий
  • PsExec.exe не удается правильно запустить скрипт?

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

    psexec -h

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

    @MaxKozlov Куратор тега PowerShell
    Можно добавить человека в группу "Операторы настройки сети" (Network Configuration Operators)
    Well-known SID S-1-5-32-556

    Но если под "обойти" вы имеете ввиду "втихаря, без прав админа" - то никак :)
    Ответ написан
    Комментировать
  • Как в батнике создавать в папке подпапку и перекидывать туда каждые 10 созданных файлов?

    @MaxKozlov
    После конвертации можно поперекидывать примерно на основе такого монстрика

    @echo off
    
    set idx=1
    set subfolder=1
    for %%f in (*. mp4) do (
      call :inc "%%f"
    )
    goto :EOF
    
    :inc
    echo %1 - %idx% - %subfolder%
    set /a "idx+=1"
    if .%idx% == .11 (
      set /a "subfolder+=1"
      set idx=1
    )


    где вместо echo %1 - %idx% - %subfolder% будет команда создания и переноса файликов в подпапочки
    Указанный код.цикла надо поместить внутрь вашего цикла и запускать после каждого обработанного файла на папке с результатами. Ну и, конечно, передвавать в подпрограмму пути к папке для перемещения

    Доводить до ума не очень хочется, по причине, озвученной в комментарии
    А переписать эти ваши 10 строк на ps займет минимум времени
    Ответ написан
    4 комментария
  • Как пройти ошибку в bat файле при присвоении имени файлам?

    @MaxKozlov
    Вы не сформулировали что именно вы хотите видеть в качестве выходного имени

    Если только part-001, part-002 и т.д., то, как и писал res2001, используйте "part-%%03d.mp4"
    Если часть исходного имени с добавкой части в конце, то можно типа "%%~ni-%%03d.mp4"

    А вообще, при отладке убирайте @echo off - будете видеть запускаемую команду со всеми подстановками
    Ответ написан
    Комментировать
  • Как узнать стоит ли софт для просмотра целостности рейда или нет в Windows Core?

    @MaxKozlov Куратор тега PowerShell
    гугль по "megaraid cmd" показывает ссылки на некую утилиту megacli
    поищите её саму и инфу по ней
    Ответ написан
    Комментировать
  • Как упаковать в exe скрипт?

    @MaxKozlov
    Скрипт на Powershell пойдёт ?
    # PSv7   $cert = [Convert]::ToBase64String((Get-Content D:\Path\To\Certificate.pfx/cer -AsByteStream), 'InsertLineBreaks')
    # PSv5.1 $cert = [Convert]::ToBase64String((Get-Content D:\Path\To\Certificate.pfx/cer -Encoding Byte), 'InsertLineBreaks')
    $Cert = @"
    MIILYgIBAzCCCx4GCSqGSIb3DQEH
    .....
    .....
    .....
    1y1lZqkQICB9A=
    "@
    
    #LocalMachine
    $location = [System.Security.Cryptography.X509Certificates.StoreLocation]::CurrentUser
    
    #ls Cert:\CurrentUser\
    #ls Cert:\LocalMachine\
    $storeName = 'TrustedPublisher'
    
    $store = [System.Security.Cryptography.X509Certificates.X509Store]::new($storeName, $location)
    $store.Open('ReadWrite')
    [byte[]]$content = [Convert]::FromBase64String($cert)
    $certificate = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($content)
    $store.Add($certificate)
    $store.Close()

    В комментариях сверху показано, как получить содержимое сертификата, которое надо подставить в $cert
    В комментариях к $location показано что ещё бывает
    В комментариях к $storeName Показано откуда его брать

    Поддерживается как импорт просто сертификата, так и pfx с ключом
    Пароль для pfx не проверял, но по идее будет работать если он будет указан как new($content, $password)
    Ответ написан
    Комментировать
  • Коммандный UAC?

    @MaxKozlov
    Смешались в кучу кони, люди....
    Так у вас нет GUI (core edition) или вы логинитесь на машину удалённо через SSH ?
    это кардинально разные истории.

    UAC - он только для интерактивных и ремотных недоменных сессий.

    https://docs.microsoft.com/en-us/troubleshoot/wind...

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

    Судя по тому что вы не хотите давать права админа некоему челу - доступ у вас есть, делайте сами удалённо :)
    Если же надо что-то этакое запустить от админа, но в локальной сессии - task scheduler.

    И только если надо непременно что-то интерактивно, локально, от админа, но кем-то другим - права локального админа на время работы.

    Кстати, при логине через ssh на винду по-моему даже недоменному админу LocalAccountTokenFilterPolicy не нужен
    Ответ написан
    3 комментария
  • Как вывести в командной строке имя запущенного batch-файла, содержащего PowerShell-скрипт?

    @MaxKozlov Куратор тега PowerShell
    Ваша ошибка в том, что код "echo %~nx0 completed!" выполняет powershell, который не знает что такое %~nx0 (echo - алиас для write-output)
    Так что или как предложил сергей кузьмин
    или такая правка
    @echo off
    @powershell.exe -ExecutionPolicy Bypass -Command "$fn = \"%~f0\"; $_=((Get-Content $fn) -join \"`n\");iex $_.Substring($_.IndexOf(\"goto :\"+\"EOF\")+9)"
    @goto :EOF
    Start-Process microsoft-edge:https://yoomoney.ru/moneylandia/lootboxes
    Start-Sleep 5
    Get-Process -Name "*msedge*" | Stop-Process
    echo "$fn completed!"
    pause
    Ответ написан
    2 комментария
  • Как изменить значение ключа реестра с командной строки?

    @MaxKozlov Куратор тега PowerShell
    По вопросу - с кавычками разберитесь.
    По жизни - не делайте так!
    Цель у вас какая-то мутная.
    Вместо того чтобы установить политики один раз как вам надо, вы городите какую-то дичь
    Ответ написан
    5 комментариев
  • Запуск Ethernet адаптера программно (с помощью Bath или PowerShell)?

    @MaxKozlov Куратор тега PowerShell
    Есои рескан в Device manager в контрольной панели ничего не находит, значит софт врятли поможет.
    можно поискать что-нибудь в devcon, типа
    devcon rescan
    devcon reset
    devcon find(all)
    Скорее всего ресет железяка хочет.
    отключить quick-boot?
    Ответ написан
    Комментировать
  • Как осуществить поиск и копирование блока строк по ключевому слову в *.txt?

    @MaxKozlov Куратор тега PowerShell
    если количество строк в каждом блоке постоянное, на powershell для парсинга подойдёт

    Select-String с параметром -Context

    Если нет - цикл вручную
    Ответ написан
    Комментировать
  • Как узнать фио удаленно по имени ПК?

    @MaxKozlov Куратор тега PowerShell
    ....расчехляю хрустальный шар....

    Если предположить что тэг Active Directory не просто так, то можно через
    (Get-CimInstance -ComputerName comptername -Class Win32_ComputerSystem).Username
    Узнать логин текущего пользователя

    А потом по логину с помощью Get-ADUser login узнать уже другую необходимую инфу
    Ответ написан
    2 комментария