Posts tagged ‘Powershell’

Reports erzeugen mit Powershell

Heute bekam ich von einer Leserin meines Blogs folgendes Powershell Skript zugesandt, das alle Bilder größer 1MB sucht in in einer HTML Datei auflistet, die dann verschickt wird.

Vielen Dank an Andrea!

"
$a = $a + "BODY{background-color:#ffffff;}"
$a = $a + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
$a = $a + "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:grey}"
$a = $a + "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:#ffffff}"
$a = $a + ""

gci "C:\Users\Uwe\" -recurse -include *.jpg,*.bmp,*.png | Where-Object {$_.Length -gt 1000KB} |
? { $_.PSisContainer -eq $false} |
Sort-Object length -descending | Select-Object Name, @{Name="Kbytes";Expression={ "{0:N0}" -f ($_.Length / 1Kb) }}, DirectoryName, CreationTime | ConvertTo-HTML -head $a -body "

Grosse Bilder

" | out-file "C:\report.htm" #Send Email $msg = $null $smtpServer = "0.0.0.0" $workpath = “\\Server\Share\Verzeichnis” $file = “$workpath\report.htm” $msg = new-object Net.Mail.MailMessage $att = new-object Net.Mail.Attachment($file) $smtp = new-object Net.Mail.SmtpClient($smtpServer) $msg.From = "sender@domain.com" $msg.To.Add("empfaenger@domain.com") #$msg.To.Add("empfaenger2@domain.com") $msg.Subject = "Bilder Report" $msg.IsBodyHTML = $true $html = "Report der Bilder" $msg.Body = $html $msg.Attachments.Add($att) $smtp.Send($msg)

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Mit Powershell alle Word-Dateien eines Verzeichnisses drucken

Hier ein paar einfache Zeilen, wie man mit Powershell alle Word-Dateien eines Verzeichnisse öffnen und drucken kann.

#Source: http://www.vistax64.com/powershell/23311-words-printout-method.html 
$wd = new-object -com word.application
$wd.visible = 1
 
$files = gci f:\abc\*.docx
 
foreach($i in $files){
    $doc = $wd.documents.open($i.fullname)
    $doc.printout()
    $doc.close()
}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Powershell: Ersetzungen in Dateinamen durchführen

Hier ein kurzer Schnipsel, wie man Zeichen in Dateinamen ersetzen kann. Für die tatsächliche Umbenennung ist das „-whatif“ zu entfernen.

$files = gci -Recurse | ? {$_.PSisContainer -eq $false} |  ? {$_.name -match "~"}
 
foreach ($i in $files){
            rni -WhatIf $i.fullname $i.Name.Replace("~","_")
}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Powershell Ressourcen

Bei der täglichen Arbeit hilft mir die Microsoft Powershell sehr. Hier ein paar Links zu den wichtigsten Büchern & Webseiten:

Bücher

  • Schnelleinstieg in die Windows Powershell von Andy Oakley
  • Windows PowerShell Crashkurs von Peter Monadjemi
  • Windows PowerShell für Administratoren und Power-User von Helma Spona
  • Windows PowerShell von Holger Schwichtenberg

Online (Microsoft)

Online

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

IO-Performance verschiedener Powershell-Befehle

http://blogs.technet.com/b/gbordier/archive/2009/05/05/powershell-and-writing-files-how-fast-can-you-write-to-a-file.aspx zeigt verschiedene Wege, mittels Powershell Daten in eine Datei zu schreiben, die Unterschiede sind schon recht drastisch zwischen den eingebauten und .Net Befehlen.

Wenn jemand selbst mal die Performance messen möchte: Unter http://poshtips.com/2010/03/30/measuring-elapsed-time-in-powershell/ findet sich ein kurzer .Net Schnipsel, um das StopWatch Objekt aus Powershell heraus anzusprechen. Der StreamWriter braucht auf meinem Laptop ca. 0,54 Sekunden.

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Powershell: AD-Gruppen des aktuellen Users auslesen

Hier ein kurzer Code-Schnipsel, um die Gruppen des aktuellen Users auszugeben:

$groups = [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups
foreach($i in $groups){
$i.Translate([System.Security.Principal.NTAccount]).value
}

Um die Gruppen eines beliebigen Users auszulesen muss ein anderer Ansatz gewählt werden: (http://stackoverflow.com/questions/8009593/list-group-memberships-for-ad-users)

Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$username = read-host -prompt "Enter a username"
$ct = [System.DirectoryServices.AccountManagement.ContextType]::Domain
$user = [System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity($ct, $username)
$groups = $user.GetGroups()
foreach($i in $groups){
     $i.SamAccountName
}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Dateien aus Unterordnern auslesen

Gegeben seien n Ordner, in denen jeweils eine Datei mit festgelegtem Namen liegt. Folgendes Skript extrahiert den Inhalt der Datei und gibt ihn zusammen mit dem Pfad aus.

Clear-Host
Clear-History
cd d:\
$folders = gci | ? {$_.PSisContainer -eq $true}
foreach ($folder in $folders){
      if ((Test-Path -path $folder\template.txt)){
            "" + $folder + ", " + (Get-Content $folder\template.txt)
      } else {
      "No template.txt in " + $folder
      }
}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Mit Powershell Verzeichnisstrukturen prüfen

Ich habe in meiner Dateiablage ein bestimmtes Namensschema, nach dem nur bestimmte Ordnernamen für Unterordner zulässig sind und außerhalb dieser Unterordner keine Dateien liegen sollen. Die folgenden Skripte helfen dabei, Abweichungen vom Schema zu finden.

Skript No. 1 sucht sich alle Ordner in der Struktur und prüft dann für jeden Ordner, ob er entweder „allowedfoldername1“ oder „allowedfoldername2“ heißt. Abweichungen davon werden mit ihrem kompletten Pfad ausgegeben.

cd "d:\Structure"
$folders = gci | ? {$_.PSisContainer -eq $true} 
 
foreach ($i in $folders){
    cd $path
    cd $i
    $subfolders = gci | ? {$_.PSisContainer -eq $true} 
        foreach ($j in $subfolders){
            if ($j.name -ne "allowedfoldername1" -and $j.name -ne "allowedfoldername2"){
                $j.fullname
            }
        }
}

Zusätzlich möchte ich prüfen, ob auch in jedem Ordner die beiden Unterordner „allowedfoldername1“ und „allowedfoldername2“ vorhanden sind. Dies geschieht in folgendem Skript mittels testpath, die Ergebnisse werden in einer CSV-Datei gespeichert.

cd "d:\structure"
 
$folders = gci | ? {$_.PSisContainer -eq $true} 
foreach ($i in $folders){
  cd $path
  cd $i
 
 if (!(Test-Path -path 'allowedfoldername1')){
  "allowedfoldername1 does not exist in `t$i" | Out-File "c:\structures-20110721.csv" -Append -Width 270
 }
 if (!(Test-Path -path 'allowedfoldername2')){
 "allowedfoldername2 does not exist in `t$i" | Out-File "c:\structures-20110721.csv" -Append -Width 270
 }
}

Ordnernamen, die nicht richtig benannt wurden, können auch einfach umbenannt werden:

Clear-History
Clear-Host
 
cd "c:\somefolder"
 
$subfolderold='oldname'
$subfoldernew='newname'
 
$folders = gci | ? {$_.PSisContainer -eq $true} 
 
foreach ($i in $folders){
    cd $path\$i
 
    if ((Test-Path -path $subfolderold)){
        rename-item -path $subfolderold -newname $subfoldernew
    }
}

Final kann noch geprüft werden, ob es Dateien gibt, die nicht in einem der beiden Unterordner, sondern im jeweiligen Ordner selbst liegen.

Clear-History
Clear-Host
cd "d:\structure"
 
$folders = gci
 
foreach ($fund in $folders){
	gci $fund | ? {$_.PSisContainer -eq $false} | Select Fullname | Out-File "c:\lonely-fund-files-20110721" -Append -Width 280
}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Powershell: aktive Benutzer und ihre Gruppen (active users and their groups)

In den letzten Tagen hatte ich die Notwendigkeit, eine Liste von Benutzern und ihren Gruppen zu erstellen. Folgendes Powershell Skript, das die QAD Extensions nutzt (), war sehr hilfreich.

Clear-History
Clear-Host
 
$users = Get-QADUser
# for single user: $users = Get-QADUser 'uwe'
 
 
foreach ($Person in $users) {
      $Person
      $groups = Get-QADMemberOf $Person -Name "group*" 
      # match all AD-groups with wildcard name "group*"
      if ($groups) { # avoids error if no group was found
            foreach ($group in $groups) {
                  "" + $group.get_Name() + "`t" + $Person.get_Name()  | Out-File "d:\users_groups.csv" -Append
            # puts all users into file 
            }
      }
}

Wenn jemand eine Möglichkeit hat, das ohne die QAD Extensions zu schaffen, bitte informiert mich.

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Word Makros aus Powershell aufrufen

Hier ein Code-Schnipsel, um aus Powershell Word heraus zu starten und das Makro „Uwe“ auszuführen:

$Word = New-Object -Com Word.Application
$Word.Visible = $true
 
$oMissing = [System.Reflection.Missing]::Value
$Document = $Word.Documents.Add($oMissing, $oMissing, $oMissing, $oMissing)
$Word.Run("Uwe")

Hier noch als kleine Erweiterung die Speicherung des Dokuments im docm-Format mit Makros:

$Word = New-Object -Com Word.Application
$Word.Visible = $true
 
$oMissing = [System.Reflection.Missing]::Value
$Document = $Word.Documents.Add($oMissing, $oMissing, $oMissing, $oMissing)
 
# http://msdn.microsoft.com/en-us/library/bb238158%28v=office.12%29.aspx
$formatDOCM = [ref] 13
$Document.SaveAs([ref] "C:\testdoc.docm",$formatDOCM)
$Word.Run("Uwe")
 
$a = $Word.Quit()

Hinweis: Dieser Code wurde mit Word 2010 ausprobiert, Word 2007 beschwerte sich über die [ref] Konstrukte in den letzten Zeilen. Wenn man diese löscht, funktioniert es auch mit Word 2007.

Hinweis: Am 10.08.2017 angepasst, dank an Paula!

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website