Встала задача — запустить скрипт powershell из обычного *.cmd. Задача традиционно возникает вследствие отсутствия ассоциаций для файлов *.ps1, и не менее традиционно решается путем создания двух файлов — скрипта на повершелле, который делает то что нужно, и обычной цмдэшки, которая его стартует. Это жесть как неудобно. Однако нагуглилось еще одно решение — повершелльный скрипт можно закодировать в одну строку и подсунуть интерпретатору, что избавляет от необходимости создавать дополнительный файл. В результате со своей несложной по сути задачей я справился, и решил привести пример скрипта, который берет тело скрипта нужной нам функциональности и генерит cmd-файл готовый к запуску.
Внутри переменной $script — тело нужного скрипта,
переменная $out задает вид генерируемого cmd-файла,
в последней строке указываем путь и имя cmd-файла (да я ленивый быдлокодер, не вынес в переменную ))
$script = { import-module activedirectory $domain = Get-ADDomain Write-Host "Последнее появление компьютера в домене" Write-Host "=======================================" Write-Host "Поиск в домене: $($domain.Name).$($domain.ParentDomain)" while($true) { $CompName = Read-Host -Prompt \'Введите короткое имя компьютера\' $CompName = $CompName -replace \'(^\s |\s $)\',\'\' -replace \'\s \',\' \' Get-ADComputer -Identity $CompName -Properties * | ft Name,LastLogonDate } } $command = $script.ToString() $bytes = [System.Text.Encoding]::Unicode.GetBytes( $command ) $encodedCommand = [Convert]::ToBase64String( $bytes ) $out ="@echo off powershell.exe -EncodedCommand $encodedCommand" $out | Out-File -Encoding ASCII -filepath c:\111.cmd
На выходе получаем:
- @echo off
- powershell.exe -EncodedCommand DQAKAA0ACgBpAG0AcABvAHIAdAAtAG0AbwBkAHUAbABlACAAYQBjAHQAaQB2AGUAZABpAHIAZQBjAHQAbwByAHkADQAKACQAZABvAG0AYQBpAG4AIAA9ACAARwBlAHQALQBBAEQARABvAG0AYQBpAG4ADQAKAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAiAB8EPgRBBDsENQQ0BD0ENQQ1BCAAPwQ BE8EMgQ7BDUEPQQ4BDUEIAA6BD4EPAQ/BEwETgRCBDUEQAQwBCAAMgQgADQEPgQ8BDUEPQQ1BCIADQAKAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAiAD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9ACIADQAKAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAiAB8EPgQ4BEEEOgQgADIEIAA0BD4EPAQ1BD0ENQQ6ACAAJAAoACQAZABvAG0AYQBpAG4ALgBOAGEAbQBlACkALgAkACgAJABkAG8AbQBhAGkAbgAuAFAAYQByAGUAbgB0AEQAbwBtAGEAaQBuACkAIgANAAoADQAKAA0ACgB3AGgAaQBsAGUAKAAkAHQAcgB1AGUAKQANAAoACQB7AA0ACgAJACQAQwBvAG0AcABOAGEAbQBlACAAPQAgAFIAZQBhAGQALQBIAG8AcwB0ACAALQBQAHIAbwBtAHAAdAAgACcAEgQyBDUENAQ4BEIENQQgADoEPgRABD4EQgQ6BD4ENQQgADgEPARPBCAAOgQ BDwEPwRMBE4EQgQ1BEAEMAQnAA0ACgAJACQAQwBvAG0AcABOAGEAbQBlACAAPQAgACQAQwBvAG0AcABOAGEAbQBlACAALQByAGUAcABsAGEAYwBlACAAJwAoAF4AXABzACsAfABcAHMAKwAkACkAJwAsACcAJwAgAC0AcgBlAHAAbABhAGMAZQAgACcAXABzACsAJwAsACcAIAAnAA0ACgAJAEcAZQB0AC0AQQBEAEMAbwBtAHAAdQB0AGUAcgAgAC0ASQBkAGUAbgB0AGkAdAB5ACAAJABDAG8AbQBwAE4AYQBtAGUAIAAtAFAAcgBvAHAAZQByAHQAaQBlAHMAIAAqACAAfAAgAGYAdAAgAE4AYQBtAGUALABMAGEAcwB0AEwAbwBnAG8AbgBEAGEAdABlAA0ACgAJAH0ADQAKAA0ACgA=
Этот файлик можно уже смело давать неподготовленному юзеру, или пихать в политики.