Von VBS nach Powershell (Verwendung der InternetExplorer.Application)
Hallo Mädels und Jungs,
vor einiger Zeit hatte ich mir mal (auch mit Eurer Hilfe) ein Script zusammengebastelt,
welches mir den Namen des aktuellen Wallpapers und eine verkleinerte Vorschau mithilfe der InternetExplorer.Application anzeigt, sowie fragt, ob ich das Bild bearbeiten will oder nicht.
Das sieht so aus:
Nun ist InternetExplorer obsolet und Edge geht nicht mit VBS/VBA.
Zur Umsetzung der Bildanzeige fand ich eine feine Geschichte mit Powershell hier:
PictureView
Habe schon ein bisschen damit herumgespielt und zum Testen eine Konstante als Parameter benutzt.
Das funktionier auch gut.
Nun möchte ich das Auslesen des Wallpapers und Weiterverarbeiten auch mit Powershell ausführen,
bin aber damit noch zu wenig bewandert.
Gibt es jemanden von Euch, der Lust und Zeit hat, mir bei der Umsetzung zu helfen?
Viele liebe Grüße
Peter
vor einiger Zeit hatte ich mir mal (auch mit Eurer Hilfe) ein Script zusammengebastelt,
welches mir den Namen des aktuellen Wallpapers und eine verkleinerte Vorschau mithilfe der InternetExplorer.Application anzeigt, sowie fragt, ob ich das Bild bearbeiten will oder nicht.
Das sieht so aus:
Option Explicit
'On Error Resume Next
const HKEY_CURRENT_USER = &H80000001
Dim objWshShell, objShellApp, oReg, strKeyPath, strValueName, strValue, objExplorer, Text, PictureName', strComputer
Dim nWidth, nHeight
Dim iValues()
Dim i, result
Dim objFSO, objFile
Dim objImage
'strComputer = "."
Set objWshShell = CreateObject("WScript.Shell")
Set objShellApp = CreateObject("Shell.Application")
Set objExplorer = CreateObject("InternetExplorer.Application")
Function ShowImage(Source)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(Source)
Set objImage = CreateObject("WIA.ImageFile")
objImage.LoadFile Source
nWidth = objImage.Width
nHeight = objImage.Height
Set objImage = Nothing
If Len(objFSO.GetFileName(objFile)) > 30 Then
PictureName = Left(objFSO.GetFileName(objFile), 30) & "..."
Else
PictureName = objFSO.GetFileName(objFile)
End If
With objExplorer
.Navigate "about:blank"
.Visible = 1
.Toolbar=False
.Statusbar=False
.Top=200
.Left=150
.Height = nHeight / 1.92
.Width = nWidth / 1.92
.Document.Title = PictureName & " Abmessungen: " & nWidth & " x " & nHeight
.Document.Body.InnerHTML = "<img src='" & Source & "' height=100% width=100%>"
End With
End Function
strKeyPath = "Control Panel\Desktop"
'Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
strValueName = "WallPaper"
oReg.GetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strValue
If inStr(1, strValue, "TranscodedWallpaper", 0) > 0 Then
strValueName = "TranscodedImageCache"
oReg.GetBinaryValue HKEY_CURRENT_USER, strKeyPath, strValueName, iValues
strValue = ""
For i = 24 to uBound(iValues)
If iValues(i) > 31 Then 'The numbers from 0 to 31 represents nonprintable ASCII codes
strValue = strValue & chr(iValues(i))
End If
Next
End If
Text = "Dateiname : " & strValue
ShowImage strValue
result = Msgbox(Text, vbYesNo, "Dateiname im Clipboard - Bild Bearbeiten?")
If result = vbYes Then
objShellApp.ShellExecute strValue, "", "", "open", 1
End If
objWshShell.Run "cmd.exe /c echo " & strValue & " | clip",0,False
objExplorer.Quit
Nun ist InternetExplorer obsolet und Edge geht nicht mit VBS/VBA.
Zur Umsetzung der Bildanzeige fand ich eine feine Geschichte mit Powershell hier:
PictureView
param(
[string]$PicturePath
)
# Usage: .\scriptname.ps1 c:\users\limi\pictures\northkoreaatnight.jpg
$PicturePath = "D:\Bilder\DesktopBackground\18_1080.jpg"
if (!$PicturePath) {
"`nAchtung, kein Bild übergeben!`n"
"Verwendung:`n$PSCommandPath [-PicturePath] voller_Pfad_zur_Bilddatei`n"
break
}
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
function display([System.Drawing.Image]$img) {
$w_form = 400 # form width
$h_form = 250 # form height
$b = [int]$img.Size.Width
$h = [int]$img.Size.Height
$b_thumb = $b
$h_thumb = $h
# portrait picture higher than 500px or landscape picture wider than 700px?
# Neu: einfach halbe Bildgröße
if ( ($b -gt $h) -and ($b -gt 700) ) {
$b_thumb = $b / 2 #700
$h_thumb = $h / 2 #[int](700 * $h / $b)
$imgthumb = $img.GetThumbnailImage($b_thumb, $h_thumb, $null, 0) # create bitmap with 700px width
}
elseif ( ($b -le $h) -and ($h -gt 500) ) {
$b_thumb =$b / 2 # [int](500 * $b / $h)
$h_thumb =$h / 2 # 500
$imgthumb = $img.GetThumbnailImage($b_thumb, $h_thumb, $null, 0) # create bitmap with 500px heigth
}
else {
$imgthumb=$img
}
$form = New-Object Windows.Forms.Form
$form.Text = $PicturePath #"Picture"
$form.Size = New-Object System.Drawing.Size($w_form,$h_form) # minimal size
$form.StartPosition = "CenterScreen"
$form.AutoSize = $True
$form.AutoSizeMode = "GrowOnly" # or "GrowAndShrink"
$form.Topmost = $True
$font_normal = New-Object System.Drawing.Font("Tahoma",12,[Drawing.FontStyle]::Regular)
$font_bold = New-Object System.Drawing.Font("Tahoma",12,[Drawing.FontStyle]::Regular) #Bold)
$PictureBox = New-Object Windows.Forms.PictureBox
$PictureBox.Location = New-Object System.Drawing.Point(5,35)
$PictureBox.Size = New-Object System.Drawing.Size($b_thumb, $h_thumb)
$PictureBox.Image = $imgthumb;
$form.Controls.Add($PictureBox)
$LabelDescription = New-Object Windows.Forms.Label
$LabelDescription.Location = New-Object System.Drawing.Point(5,5)
#$LabelDescription.Size = New-Object System.Drawing.Size(375,25)
$LabelDescription.Font = $font_bold;
$LabelDescription.Text = "Originalgröße: $b x $h, Displaygröße: $b_thumb x $h_thumb"
$LabelDescription.AutoSize = $True
$form.Controls.Add($LabelDescription)
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Size = New-Object System.Drawing.Size(75,45)
# OKButton centered under the picture
$OKButton.Location = New-Object System.Drawing.Point( (($form.Size.Width - $OKButton.Size.Width) / 2),(50+$h_thumb) )
$OKButton.Text = "OK"
$OKButton.Font = $font_bold
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.Controls.Add($OKButton)
$form.AcceptButton = $OKButton
return $form.ShowDialog()
}
# read image file to byte array
try {
$img = [System.IO.File]::ReadAllBytes("$PicturePath")
}
catch {
"Error reading file. Please give me the full path to the image file.`nExiting ..."
break
}
$ms = New-Object System.IO.MemoryStream # i need some memory
$ms.Write($img, 0, $img.Length) # image bytes to memory stream
# convert image to Windows System Bitmap
try {
$img = [System.Drawing.Image]::FromStream($ms,$true,$true)
}
catch {
"Error loading image.`nExiting ..."
$ms.Dispose() # free memory
break
}
$ms.Dispose() # free memory
display($img)
Habe schon ein bisschen damit herumgespielt und zum Testen eine Konstante als Parameter benutzt.
Das funktionier auch gut.
Nun möchte ich das Auslesen des Wallpapers und Weiterverarbeiten auch mit Powershell ausführen,
bin aber damit noch zu wenig bewandert.
Gibt es jemanden von Euch, der Lust und Zeit hat, mir bei der Umsetzung zu helfen?
Viele liebe Grüße
Peter
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1937326515
Url: https://administrator.de/contentid/1937326515
Ausgedruckt am: 19.11.2024 um 04:11 Uhr
8 Kommentare
Neuester Kommentar
Nun möchte ich das Auslesen des Wallpapers und Weiterverarbeiten auch mit Powershell ausführen,
$wallpaper = Get-ItemPropertyValue "HKCU:\Control Panel\Desktop" -Name Wallpaper