Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Извлечение .ico файлов (http://forum.oszone.net/showthread.php?t=320616)

vickt 09-11-2016 15:08 2686088

Извлечение .ico файлов
 
Необходимо извлечь из .exe файла .ico при помощи BAT (можно использовать сторонние утилиты).
Я нашел одну утилиту - iconsext, но она извлекает все иконки, а надо чтобы извлекала первую.

greg zakharov 09-11-2016 16:19 2686107

Цитата:

Цитата vickt
Необходимо извлечь из .exe файла .ico при помощи BAT (можно использовать сторонние утилиты)

Как на счет PowerShell?
Код:

Add-Type -AssemblyName System.Drawing
$ico = [Drawing.Icon]::ExtractAssociatedIcon('C:\Windows\explorer.exe')

$ms = New-Object IO.MemoryStream
$ico.Save($ms)
[IO.File]::WriteAllBytes('C:\output\1.ico', $ms.ToArray())

$ms.Dispose()
$ico.Dispose()


vickt 09-11-2016 17:33 2686120

Цитата:

Цитата greg zakharov
Как на счет PowerShell? »

Я в Bat файлах далекий, а PowerShell для меня - темный лес.
Пытался его запустить через Bat, не получилось, а через powershell_ise.exe выдает ошибку.
Скрытый текст
PS C:\Windows\System32\WindowsPowerShell\v1.0> C:\Downloads\New.ps1
Невозможно загрузить файл C:\Downloads\New.ps1, так как выполнение сценариев отключено в этой системе. Для получения дополнительных сведений см. about_Executio
n_Policies по адресу http://go.microsoft.com/fwlink/?LinkID=135170.
+ CategoryInfo : Ошибка безопасности: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnauthorizedAccess

PS C:\Windows\System32\WindowsPowerShell\v1.0>

Iska 09-11-2016 18:14 2686129

vickt, так пройдите по указанному адресу, прочитайте и включите исполнение неподписанных локальных скриптов.
Код:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

vickt 09-11-2016 18:33 2686133

Цитата:

Цитата Iska
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned »

Я уже отключил политику выполнения Windows PowerShell.
Выдает следующее через powershell_ise.exe
Скрытый текст
PS C:\Windows\System32\WindowsPowerShell\v1.0> C:\Downloads\New.ps1
Не удалось найти тип [Drwaing.Icon].
C:\Downloads\New.ps1:2 знак:8
+ $ico = [Drwaing.Icon]::ExtractAssociatedIcon('C:\Windows\explorer.exe ...
+ ~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (Drwaing.Icon:TypeName) [], RuntimeException
+ FullyQualifiedErrorId : TypeNotFound

Невозможно вызвать метод для выражения со значением NULL.
C:\Downloads\New.ps1:5 знак:1
+ $ico.Save($ms)
+ ~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Исключение при вызове "WriteAllBytes" с "2" аргументами: "Не удалось найти часть пути "C:\output\1.ico"."
C:\Downloads\New.ps1:6 знак:1
+ [IO.File]::WriteAllBytes('C:\output\1.ico', $ms.ToArray())
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DirectoryNotFoundException

Невозможно вызвать метод для выражения со значением NULL.
C:\Downloads\New.ps1:9 знак:1
+ $ico.Dispose()
+ ~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull


PS C:\Windows\System32\WindowsPowerShell\v1.0>


Мне надо запустить из Bat файла. Как это сделать?

Iska 09-11-2016 19:22 2686145

vickt, поменяйте во второй строке:
Код:

$ico = [Drwaing.Icon]::ExtractAssociatedIcon('C:\Windows\explorer.exe')
на:
Код:

$ico = [Drawing.Icon]::ExtractAssociatedIcon('C:\Windows\explorer.exe')

greg zakharov 09-11-2016 19:32 2686149

vickt, сохраните как бат, например, iconer.cmd:
Код:

<# :
  @echo off
    setlocal
      powershell /noprofile /executionpolicy bypass^
      "&{[ScriptBlock]::Create((Get-Content '%~f0') -join [Char]10).Invoke(@(&{$args}%*))}"
    endlocal
  exit /b
#>
Add-Type -AssemblyName System.Drawing

try {
  $ico = [Drawing.Icon]::ExtractAssociatedIcon($args[0])
 
  $ms = New-Object IO.MemoryStream
  $ico.Save($ms)
  [IO.File]::WriteAllBytes($args[1], $ms.ToArray())
}
catch { $_ }
finally {
  if ($ms) { $ms.Dispose() }
  if ($ico ) { $ico.Dispose() }
}

Пример вызова будет выглядеть так:
Код:

iconer.cmd C:\Windows\explorer.exe E:\out\1.ico

vickt 09-11-2016 22:03 2686185

Большое Всем спасибо.


Время: 13:59.

Время: 13:59.
© OSzone.net 2001-