Quantcast
Channel: Windows PowerShell Forum
Viewing all 2314 articles
Browse latest View live

Laufwerkpfad und String in Datei schreiben, newbee

$
0
0

Hallo zusammen

ich möchte ein Powershellscript erstellen, dass wenn sich User anmeldet den angemeldeten User und von einem bestimmten Netzwerklaufwerk den Displaypfad in eine Datei schreiben damit ich diese später in einem zweiten Powershell mittels Import im AD (es wird der Pfad in ein CustomAttribut geschriebent) verarbeiten kann.

bin aber noch ganz am Anfang.

$UserID=$env:USERNAME   ==> passt, hier erhalte ich korrekt nur das Ergebnis ohne Überschrift

erstes Problem

$Path = get-psdrive -name "M" | select Displayroot  ==> hier erhalte ich eine Überschrift und die Variable

$PathNeu = $Path.tostring() + "\Unterverzeichnis"   ==> verknüpfen geht nicht - wie kann ich die Variable mit einen String verbinden

$MPathN = $MPath.ToString() + "\Scanner"  ==> geht auch nicht

ergibt \Scanner


CH


Remote Read-Host ohne Warn-Meldung

$
0
0

Hallo zusammen,

ich möchte für nachfolgenden Befehl die Warn-Meldung unterdrücken:

Invoke-Command -ComputerName HostA.Domain.Local -ScriptBlock {
    $var = Read-Host "Passwort" -AsSecureString
}


Meldung:

WARNING: A script or application on the remote computer A4TSQL111.A4T.LOCAL is sending a prompt request. When you are prompted, enter sensitive information, such as credentials or passwords, only if you trust the r
emote computer and the application or script that is requesting the data.

Ich verstehe den Ursprung dieser Meldung und kann auch nachvollziehen, dass diese wichtig ist; allerdings stört sie im Script-Ablauf. Ich habe bereits mit -WarningAction SilentlyContinous und mit 3>$Null geteste, ich bekomme diese Meldung nicht unterdrückt.

Hat mir jemand hierzu einen Tipp?

Viele Grüße
Kai Koppelmann

Remote-Powershell-Session über Zertifikat Authentifizierung auf Win 2012 R2 Standard

$
0
0

Hallo,

ich versuche aktuell einen Remote-Zugriff auf einen unserer Windows
2012 R2 Standard Server zu bekommen, in dem ich Zertifikate und die
Powershell nutze.

Vorstellung der teilnehmenden Server:

1.       Der Server, den ich
erreichen will (ich werde ihn im Folgenden als Ziel-Server bezeichnen)
befindet sich in unserer DMZ, hat zuletzt im März 2015 Microsoft Updates
bekommen und besitzt eine Powershell Version
4.0. Sein Name beinhaltet einen Unterstrich („_“) und drei Zahlen, er
ist Teil einer Arbeitsgruppe.

2.       Der Server, mit dem
ich den Zugriff ausführen will (im Folgenden der Quell-Server) ist
ebenfalls ein Windows 2012 R2 Standard, wurde zuletzt in diesem Jahr im
April geupdated, ist Teil unserer Domäne und hat
ebenfalls eine Powershell Version 4.0.

3.       Ich habe weiterhin
bereits erfolgreich einen Zugriff auf einen weiteren Server in unserer
DMZ hergestellt. Dieser ist ebenfalls ein Windows 2012 R2 Standard,
wurde zuletzt in diesem Jahr im April geupdated,
hat ebenfalls eine Powershell Version 4.0 und ist Teil einer
Arbeitsgruppe (allerdings einer anderen, als der problematische Server).

Wenn möglich soll ein Updaten der Server/des Servers vermieden werden!

Aus den Ereignislogs ließen sich keine weiteren Angaben entnehmen,
sie beinhalteten nur die unten genannte Fehlermeldung und zusätzlich die
Event-ID 32784, zu welcher ich jedoch keine weiterführenden
Informationen ermitteln konnte.

Weg zum Zugriff:

Schritte, die auf dem Ziel-Server durchgeführt wurden:

1.       Ich erstelle mit der
MMC einen lokalen Benutzer „service“ , gebe ihm ein Passwort das nicht
abläuft und füge ihn in die lokale Gruppe „Administratoren“ ein

2.       Ich öffne die PS als Administrator und führe folgendes aus

a.       Enable-PSRemoting –Force

b.      Set-Item wsman:\localhost\client\trustedhosts *

c.       Restart-Service WinRM

Schritte, die auf dem Ziel-Server durchgeführt wurden:

1.       Ich erstelle einen Listener für den HTTPS-Transport über die CMD mit dem folgenden Kommando:

winrm create winrm/config/Listener?Address=*+Transport=HTTPS
@{Hostname="<Name des
Ziel-Servers>";CertificateThumbprint="‎‎‎<Thumbprint des
Ziel-Server-Zertifikates>‎‎‎‎‎‎‎‎‎"}

2.       Ich füge eine Regel zu der Firewall des Zielservers hinzu, indem ich die CMD und folgendes Kommando verwende:


netsh advfirewall firewall add rule name="Windows-Remoteverwaltung
(HTTPS eingehend)" dir=in action=allow program=System enable=yes
profile=domain protocol=tcp localport=5986

(Ja, dort wird angegeben „profile=domain“ but I aber ich habe die
Profilmöglichkeiten auch bereits auf „Privat“ und „Öffentlich“ gesetzt!)

Schritte, die auf dem Quell-Server durchgeführt wurden:

1.       Ich teste den remote Zugriff via PS, wobei ich die Anmeldedaten und folgenden Powershellbefehl benutze:

Enter-PSSession –ComputerName <Name des Ziel-Servers> -Credential (Get-Credential) –USESSL

Das hat funktioniert!

2.       Ich verlasse die Sitzung (“Exit-PSSession”)

Schritte, die auf dem Ziel-Server durchgeführt wurden:

1.       Jetzt komme ich zum Certmapping. Dafür verwende ich wieder die Powershell und folgenden Befehl:

New-Item -Path WSMan:\localhost\ClientCertificate -Credential
(Get-Credential) -Subject <name Quell-Server > -URI * -Issuer
<Thumbprint des Aussteller-Zertifikates> -Force

Ein popup Fenster erscheint, in welches ich die Anmeldedaten von “service” eingebe.

2.       Wenn das getan ist, erlaube ich die Zertifikatsauthentifizierung via CMD:

winrm set winrm/config/service/auth @{Certificate="true"}

Schritte, die auf dem Quell-Server durchgeführt wurden:

1.  Ich versuche nun den Zugriff zu testen in dem ich folgenden Befehl in der Powershell ausführe (natürlich als Adminsitrator):

Enter-PSSession –Computername <Name des Ziel-Servers> -CertificateThumbprint <thumbprint des Quell-Servers>

Egal, was ich bisher versucht habe (und das war sehr viel, dazu komme
ich später), ich habe immer die folgende Fehlermeldung bekommen:

Hier sind einige meiner bisherigen Versuche (inclusive Neustarts an den Stellen, an denen sie benötigt wurden):

·         Ich habe versucht, das Certmapping auf den vordefinierten Administrator Account um zu stellen

·         Ich habe die UAC auf den gleichen Status gebracht, in dem die des Servers ist, auf dem das Procedere funktioniert.

o   Ich
habe den daraus entstehenden Regedit-Eintrag (unter
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
„LocalAccountTokenFilterPolicies“ ) geprüft
und auch hier keinen Unterschied festgestellt.

·         Ich habe die Kerberos Authentication aus gestellt

·         Mit „service” angemeldet, um den Nutzerordner zu erstellen

·         Ich habe die verschiedenen Namen (dns) des Ziel-Servers in das Zertifikat eingefügt

·         Ich habe die verschiedenen Namen für den Server in dem PS-Testbefehl zur Zertifikatsverbindung getestet

·         Ich habe das Zertifikat geprüft und sichergestellt, dass

o   es
aktuell ist

o   es die notwendigen Schlüsselverwendungen und die erweiterten Schlüsselverwendungen enthält

o   alle Daten wie den Anzeigennamen etc. keine Tippfehler enthalten

o   alle Zertifikate in die Richtigen Ordner (mittels MMC) übernommen wurden

·         Ich habe die Gruppe des “service” Accounts auf “remoteverwaltungsbenutzer” umgestellt

·         Geprüft, ob der Ziel-Server die Zertifikatsperrliste erreichen kann

·         Die IP anstelle des Servernamens für den zertifikatbasierten Zugriff verwendet

·         Die Benutzerrechte von “service” manuell angepasst(auf verschiedenen Wegen, z.B. via PS oder die Systemsteuerung)

·          “service” neuerstellt und verschiedene Passwörter getestet, die z.B. Sonderzeichen enthalten oder auch nicht enthalten haben

·         Alle oben genannten Schritte mehrfach wiederholt, um Flüchtigkeitsfehler aus zu schließen

·         Die Gruppenrichtlinien geprüft

Variable in Copy-item verwenden

$
0
0

hallo zusammen

eigentlich zwei Fragen: wie kann man Variable oder auch die typischen %USERPROFILE%\Desktop in copy befehlen verwenden?

get-date (Powershell Objekt) geht zb. auch nicht  auch nicht mit get-date.tostring()

$a = (get-date -Format YYYYMMDD)
$a = a$ + ".txt"
Copy-Item c:\temp\test.txt -Destination $a


CH


SendTimeout-Wert erhöhen

$
0
0

Ein Powershell Skript gibt folgenden Fehler aus:

Update-Entity        Beim Anforderungskanal ist während des Wartens auf eine Antwort nach 00:05:00 eine Zeitüberschreitung aufgetreten. Erhöhen Sie den an den Aufruf übergebenen Zeitlimitwert auf "Request", oder
erhöhen Sie den SendTimeout-Wert für die Bindung. Der für diesen Vorgang zugewiesene Zeitraum war möglicherweise ein Teil eines längeren Timeouts.    

Weiß jemand, wo der Zeitlimitwert auf "Request" oder der SendTimeout-Wert gesetzt werden muß? Das Script soll ja ohne Fehler laufen und auch warten, bis die gewünschte Aktion beendet ist.

Danke.

Powershell Logging

$
0
0

Hallo

ich möchte gerne ein Log erstellen, welche Daten verarbeitet wurden.

wo und wie müsste ich das einbauen - vor der letzten Klammer?

 und anscheinend ist der Import in einem anderen Format. Da der Import funktioniert, möchte ich hier das Encoding nicht ändern. Bei out-file gibt es keine -Encoding Property?
$import = import-csv \\server\data\Dir.txt
$import | foreach{Set-AdUser -Identity $_.UserID -replace @{extensionAttribute1 = $_.ScanDir} | out-file $_.UserID -append c:\temp\x.log}
Error:

ut-File : Cannot validate argument on parameter 'Encoding'. The argument "c:\temp\x.log" does not belong to the set

"unknown,string,unicode,bigendianunicode,utf8,utf7,utf32,ascii,default,oem" specified by the ValidateSet attribute. Supply an argument that is in the set and then try the command again


Chris


wbadmin start backup funktioniert erst beim zweiten mal starten

$
0
0

Hallo liebe Community,

ich schreibe zur Zeit ein PowerShell Skript, dass den Start eines Systemabbildes anstoßen soll. Das Skript willl ich dann in einem Java Programm benutzten. Deshalb muss es auf Anhieb klappen.

Folgendes Problem: Ich klicke in der ISE auf ausführen und das Skript gibt mir den Fehler zurück, dass der Parameter "include" fehlt. Drücke ich ohne etwas zu ändern nochmal auf ausführen, startet die Sicherung!

Was mache ich falsch?

Hier mein Skript:

#Schritt 1: Variablen definieren

$Index1 = 0 # Index-Variable für spätere Abfrage
$AnzahlSicherungen = 2 #Anzahl vorzuhaltender Sicherungen
#Start-Sleep -s 1
$Zeitstempel = get-date -format "dd.MM.yyyy_HH-mm-ss" # Zeitstempel erstellen
$hostname =$env:COMPUTERNAME # Computername Zwischenspeichern
$ZielVZ = "\\meinServer\meinOrdner\"+$hostname+"\" # Netzwerkfreigabe
$gciVZ= "\\meinServer\meinOrdner\"+$hostname #Pfad für die Get-Childitem-Abfrage
$Dateiname = $hostname+"_" # Ordner Name mit PC Name. Danach wird der Zeitstempel angehangen.
$VZ = $ZielVZ + $Dateiname + $Zeitstempel #Pfad für Sicherungsdateien zusammenfügen.
$befehl= "C:\Windows\System32\wbadmin.exe start backup ""-backupTarget:$VZ"" -quiet ""-include:$ZuSicherndeSL"" -allCritical"""""

# Schritt 2: Neues Verzeichnis anlegen
# und die älteste Sicherung, bis auf die vorzuhaltenden Sicherungen, löschen
md $VZ
$PSFolder = gci $ZielVZ |? {$_.name -like $hostname + "*" } |Sort-Object name -descending
Foreach ($Folder in $PSFolder) #überprüfe für jeden Ordner in der Liste $PSFolder
{
   $Index1++ ##index Variable hochzählen
 
   # Alte Sicherungen, die nicht mehr benötigt werden, wieder löschen.
   If ($Index1 -gt $AnzahlSicherungen)
   {
      Remove-Item $Folder.FullName -recurse
   }
 
}

# Schritt 3: Zu sichernde Systemlaufwerke ermitteln
# Ermitteln der GUID des Boot Volume
$BootVolume = get-wmiobject Win32_Volume -filter "BootVolume='True'"
$ZuSicherndeSL = $BootVolume.DeviceId

# Schritt 4: Befehl zum Start der Erstellung des Systemabbildes
invoke-expression $befehl #genauer Befehl in variable zwischengespeichert

Grundlage für das Skript war ein post von tomshardware (google) ich darf noch keinen link posten


FolderPermission für mehrere Postfächer anzeigen

$
0
0

Hallo zusammen,

kann es sein, dass im normalen Powershell einige Exchange Befehle nicht gehen?

das funktioniert in der EMS

$a = get-mailbox -database user
$a | foreach{Get-MailboxfolderPermission $_":\Kalender"}

jetzt möchte ich gerne auch den Benutzername der Mailbox sehen. Falls es mit obigen Beispiel in einer Zeile geht wäre es noch schöner.

$a = get-mailbox -database user
$a | foreach{Get-MailboxfolderPermission $_":\Kalender" + $a.SamAccountName}

geht leider nicht

ich habe es jetzt mehrzeilig im normalen Powershell ISE probiert.

Get-PSSnapin -Registered | Add-PSSnapin
get-exchangeserver
get-mailbox -id "test"
$a = get-mailbox -Database vip
foreach($user in $a)
{
$b = Get-MailboxfolderPermission $_":\Kalender"
write-host $user,$b
}

get-mailbox -id "test" geht also sollte die Verbindung zum Exchange passen.

das andere leider nicht - vermutlich, da MeinPC anstelle des Exchangeservers aufgelöst wird.

Get-MailboxfolderPermission : In Active Directory können keine Informationen über den lokalen Server MeinPC???.magsbg.gv.at gefunden werden. Grund hierfür kann einer

Änderung des Servernamens sein.

In Zeile:5 Zeichen:14

+ $a | foreach{Get-MailboxfolderPermission $_":\Kalender" }

+              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : NotSpecified: (:) [Get-MailboxFolderPermission], LocalServerNotFoundException

    + FullyQualifiedErrorId : [Server=MeinPC?????,RequestId=12805-1bd-48d7-a3d0-3687fa5522ef,TimeStamp=09.12.2016 11:21:37] [FailureCategory=Cmdlet-LocalServerNotFoundExc

   eption] B6AC2E08,Microsoft.Exchange.Management.StoreTasks.GetMailboxFolderPermission

 


Chris


Problem bei Button Events

$
0
0

Hallo zusammen,

ich bastel gerade an einem kleinen Skript mit GUI zum Sichern von Dateien. Leider habe ich das Problem, das ich, egal ob ich den OK, Cancel oder Schließen ("X)" Button betätige, immer das gleiche Ergebnis erhalte.

Beim Klick auf "Start" soll die eigentliche Backupfunktion starten und bei X bzw Cancel das Fenster ohne jegliche Aktion geschlossen werden.

Ich finde den Fehler leider nicht, hier der Code:

$drives = Get-PSDrive -PSProvider FileSystem

[void] [System.Reflection.Assembly]::LoadWithPartialName(„System.Drawing“)
[void] [System.Reflection.Assembly]::LoadWithPartialName(„System.Windows.Forms“)
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = „directory backup“
$objForm.Size = New-Object System.Drawing.Size(400,300)
$objForm.StartPosition = „CenterScreen“
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq „Escape“) { $objForm.DialogResult=“Cancel“;$objForm.Close()} })


$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,40)
$objLabel.Size = New-Object System.Drawing.Size(280,20)
$objLabel.Text = „Welcher Ordner soll gesichert werden?“
$objForm.Controls.Add($objLabel)

$objbackupsrc = New-Object System.Windows.Forms.TextBox
$objbackupsrc.Location = New-Object System.Drawing.Size(10,60)
$objbackupsrc.Size = New-Object System.Drawing.Size(300,20)
$objForm.Controls.Add($objbackupsrc)

$objbackupbrowsebtn = New-Object System.Windows.Forms.Button
$objbackupbrowsebtn.Location = New-Object System.Drawing.Size(320,60)
$objbackupbrowsebtn.Size = New-Object System.Drawing.Size(50,20)
$objbackupbrowsebtn.Text = "Suche"
$objForm.Controls.Add($objbackupbrowsebtn)

$objbackupbrowsebtn.Add_Click(
        {
		Add-Type -AssemblyName System.Windows.Forms
        $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
        [void]$FolderBrowser.ShowDialog()
        $objbackupsrc.Text = $FolderBrowser.SelectedPath
        }
    )

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,100)
$objLabel.Size = New-Object System.Drawing.Size(280,20)
$objLabel.Text = „Ziellaufwerk“
$objForm.Controls.Add($objLabel)

$objbackupdst = New-Object System.Windows.Forms.Combobox
$objbackupdst.Location = New-Object System.Drawing.Size(10,120)
$objbackupdst.Size = New-Object System.Drawing.Size(360,20)
foreach ($drive in $drives)
{
[void] $objbackupdst.Items.Add($drive.Root)
}
$objbackupdst.Height = 70
$objbackupdst.Sorted = $true
$objForm.Controls.Add($objbackupdst)
$objForm.Topmost = $True
$objForm.Add_Shown({$objForm.Activate()})

$objbackupbtn = New-Object System.Windows.Forms.Button
$objbackupbtn.Location = New-Object System.Drawing.Size(40,160)
$objbackupbtn.Size = New-Object System.Drawing.Size(66,20)
$objbackupbtn.Text = "Start"
$objbackupbtn.DialogResult = "OK"
$objForm.Controls.Add($objbackupbtn)

$objcancelbtn = New-Object System.Windows.Forms.Button
$objcancelbtn.Location = New-Object System.Drawing.Size(140,160)
$objcancelbtn.Size = New-Object System.Drawing.Size(66,20)
$objcancelbtn.Text = "Abbruch"
$objcancelbtn.DialogResult = "Cancel"
$objcancelbtn.Add_Click({$objForm.Close()})
$objForm.Controls.Add($objcancelbtn)

[void] $objForm.ShowDialog()

function Start-Backup
{

Write-Host "Start Button gedrückt"

}

if($objbackupbtn.DialogResult = "OK")
{
Start-Backup
}

Ich hoffe es kann jemand helfen!

Danke im Voraus.



Freundliche Grüße

Sandro
MCSA: Windows Server 2012
Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)



Wie kann ich das Konsolenfenster beim starten eines PS-Scripts scriptintern unterdrücken?

$
0
0

Hi,

ich habe ein PS-Script welches ich über eine Verknüpfung starte. Beim Start erscheint die Konsole und ich muss eine Eingabe tätigen um fortzufahren (Logindaten). Anschließen soll sich das Konsolenfenster schließen und eine Winform angezeigt werden. Um die Konsole nach der Eingabe "unsichtbar" zu machen, habe ich folgenden Code gefunden...

$window = Add-Type -memberDefinition @" [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);"@ -name "Win32ShowWindowAsync" -namespace Win32Functions passThru $window::ShowWindow((Get-Process –id $pid).MainWindowHandle, 0)

...welcher aber nicht funktioniert. Es kommt zur folgenden Fehlermeldung:

Add-Type : A positional parameter cannot be found that accepts argument 'passThru'.

Danke für eure Hilfe

Grüße

PS: Ich möchte nicht -windowstyle -hidden zum Pfad in der Verknüpfung hinzufügen


get-process, username, switchparameter, Grundlagen

$
0
0

hallo

eine Grundlagen Frage:

wenn man get-process |get-member eingibt gibt es kein Propertiy Usernamen.

get-process |select *

ebenfalls nicht.

mit get-process -includeusername (in Powersehll vermutlich ein Switch-Parameter) kommt auch der Benutzernamen.

wie funktioniert das. eigentlich müsste ja alle Properties auch bei get-process dabei sein?


Chris

parameter hilfe grundlagen

$
0
0

Hallo zusammen,

ich versuche gerade die Hilfe etwas mehr zu verstehen:

Beispiel

1. get-help restart-Computer -Parameter *Computer* oder "*Computer*" geht leider nicht da hier kein like * erlaubt ist.

lässt sich das aus der Hilfe herauslesen?

2. eine Kombination von paramertern ist auch nicht immer erlaubt

PS H:\> get-help restart-computer -parameter whatif -showwindow
Get-Help : Der Parametersatz kann mit den angegebenen benannten Parametern nicht aufgelöst werden.
In Zeile:1 Zeichen:1
+ get-help restart-computer -parameter whatif -showwindow

lässt sich das auch aus der Hilfe herauslesen? Liegt es daran, dass dies ein SwitchParameter ist? und man diese nicht mit Named Parametern mischen darf.

    -ShowWindow<SwitchParameter>        Displays the help topic in a window for easier reading. The window includes a Find search feature and a Settings box that lets you set options for the display. These include options to display only selected sections of a help topic.                Erforderlich?                  true        Position?                      named        Standardwert                   False        Pipelineeingaben zulassen?     False        Platzhalterzeichen zulassen?   false


Chris

filter vs where und select, Verständnisfrage

$
0
0

hallo zusammen,

wieder mal eine/zwei/drei Verständnisfrage(n).

irgendwie verwirrt das am Anfang noch etwas wann man was wie einsetzen soll.

(verzeiht falls ich ein falsches und unglückliches Beispiel erwische)

zb. kann man mit pipe und select -propertiy * alle Felder/Properties anzeigen lassen und mit where Filtern

get-process | select -property * -First 1

Get-Eventlog -Logname System -EntryType Error -Newest 20 

erzeugt ähnliches. Wäre es da nicht einfacher man gewöhnt sich generell den pipe | Select, und where an und man muss nicht bei jedem Cmdlet stundenlang die Hilfe studieren welche Parameter möglich sind?

rasche Vorgehensweise wäre doch

1.get-Eventlog => alle Properties/Felder anzeigen

2.  dann zb. | where EntryType -eq 'Error' => ok die obige Schreibweise ist kürzer aber man muss sich erst die Hilfe zu Gemüte führen.

get-childitem -filter

ginge vermutlich auch mit get-childitem | where ...

pipe -First 1 oder -Newest vom Cmdlet

um bei dem zweiten Beispiel get-eventlog zu bleiben. Ich glaube mir sind sicher schon einige Exchange cmdlet untergekommen die ebenfalls direkt beim cmdlet ein property * erlauben. Aber vielleicht täusche ich nicht jetzt auch.


Chris


pipe Datenmenge, Verständnisfrage

$
0
0

noch eine Frage

kann man davon ausgehen das bei Powershell  trotzt PIPE immer noch alle Objekte - auch wenn sie mit where gefiltert werden - erhalten und weitergegeben werden. Ich hatte einmal ein GROUP Beispiel, da war vorher ein where und group im letzten  Pipe wurden der group wieder extrahiert. Da muss man anfangs etwas umdenken. Also anders wie bei anderen Systemen.

zb. bei einer SQL Abfrage gefiltert auf PLZ 10115 sind nur Daten 10115 enthalten. Da könnte man später nie auf mehr Daten zurückgreifen.



Chris

Daten aus vielen .htm-Dateien auslesen und in csv-datei schreiben

$
0
0
Hallo zusammen,



ich versuche mich gerade an meinem ersten Powershell-Script, komme aber nicht weiter. Ich habe in einem Ordner knapp 50.000 HTML Dateien und möchte aus allen Dateien eine bestimmt Passage auslesen. IN allen HTML Dateien gibt es die folgende Information mit stets gleichem Aufbau

<meta name="description" content="Produktname, Produktnummer, Kategorienummer" />

Ich möchte nun die fett markierten Informationen aus allen Dateien auslesen und in eine einzige CSV-Datei schreiben.

Folgende Versuch schlägt leider fehl:  

Select-String -path D:\Htmdateien\*.htm -Pattern "<meta name="description" content="Produktname, Produktnummer, Kategorienummer" />" | ConvertTo-csv -As "List" | out-file $env:userprofile\Desktop\Linkliste.csv

Kann mir jemand helfen?

Vielen Dank für Eure Hilfe

-ExpandProperty

$
0
0

moin,

führt man nachfolgende Befehl aus

Get-ChildItem -Path c:\temp -filter *.jpg -Recurse | fl

erhält man VersionsInfo, File

Name           : k-20160102_124404.jpg
...

Target         : {}
VersionInfo    : File:             C:\temp\verkleinert1025\k-20160102_124404.jpg
                 InternalName:    
                 OriginalFilename:
                 FileVersion:     
                 FileDescription: 

jetzt wäre es doch naheliegend, dass man das Property/Objekt entweder mit VersionInfo.File oder InternatName bei ExpandProperty zum erweitern des Objektes VersionsInfo angeben könnte?

im meinem Beispielbuch steht

Get-ChildItem -Path c:\temp -filter *.jpg -Recurse | select -ExpandProperty fullname


wie soll denn da einer drauf kommen. Selbst in der Hilfe findet man den Parameter "Fullname" nicht


Chris

hier passt es zb. beides CommandLine

get-history |select -ExpandProperty Commandline
Get-History | fl

Powershell.exe und Anzeigeskalierung (dpi)

$
0
0

Hallo,

bei Benutzeranmeldung lasse ich ein Skript ausführen, welches die Bildschirmauflösung erkennt:

 

  [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

  $Hauptbildschirmgröße = [System.Windows.Forms.SystemInformation]::PrimaryMonitorSize

  $Breite = $Hauptbildschirmgröße.Width

  $Höhe   = $Hauptbildschirmgröße.Height

  [System.Windows.Forms.MessageBox]::Show(„$Breite und $Höhe",“SystemInformation“,0)

 

Das funktioniert einwandfrei, wenn die Anzeigeskalierung bei 100 % steht.

 

Starte ich allerdings z.B. von einem Rechner mit einer Auflösung von 3840x2160 und einer Skalierung von 225 %, dann zeigt mir obiges Skript ausgeführt mit:

PowerShell.exe: 1707 x 960

PowerShell_ISE.exe: 3840 x 2160

oder bei 150 %:

PowerShell.exe: 2560 x 1440

PowerShell_ISE.exe: 3840 x 2160

 

Die Messagebox aus PowerShell.exe sieht matschig aus und zeigt die falsche Auflösung. PowerShell_ISE.exe scheint auf die Skalierung zu reagieren und zeigt die richtige Auflösung.

 

Meine Idee war, das Skript einfach bei Benutzeranmeldung automatisch in PowerShell_ISE.exe zu starten, aber das ist mir nicht gelungen. Den Skalierungsfaktor zu ermitteln, scheint kompliziert zu sein, denn die Umsetzung unterscheidet sich von Windows 7 bis 10.

Ich freue mich über jeden Tipp.

 

Gruß, Eric

get-content delimiter, Array Split

$
0
0

hallo zusammen,

teste und spiele gerade mit Array und Textimporten und wollte folgendes probieren.

Text Import in ein Objekt - dann wieder aufteilen (bei Excel gibt es so eine Funktion) vielleicht gibt es ähnliches bei Powershell.

dabei ist mir bei testen aufgefallen, dass der Get-content schon so nicht geht (import-csv geht). Aber eigentlich sollte ja get-content auch gehen.

Muster für euch zum testen.

"eins,11","zwei,22","drei,33" > c:\temp\test.txt
Get-Content c:\temp\test.txt | where {$_.Split(",")}

PS-TEST> Get-Content c:\temp\test.txt | where {$_.Split(",")}
eins,11
zwei,22
drei,33

Delimiter beim einlesen hilft auch nicht

PS-TEST> Get-Content c:\temp\test.txt -Delimiter ","
eins,
11
zwei,
22
drei,
33

Wenn import erfolgreich: kann man das dann anschließend drehen? (nur eine spielerei, weil es mir beim lesen aufgefallen ist)


Chris

XAML Combobox

$
0
0

Hallo @All,

erstmal ein frohes neues Jahr an alle.

Ich bin seit einiger Zeit dabei ein kleines Programm zu schreiben XAML Powershell.

Nun, habe ich den XAML teil schon ansatzweise fertig und möchte nun die Funktion des Tools zusammensetzten.

Jetzt bin ich gerade bei dem Punkt Combobox Language und habe da ein Problem, wo ich irgendwie nicht weiter komme.

Die Combobox hat zwei spalten, einmal den Ländercode und die Spalte Code Auflösung.

Wenn ich nun Die Sprache wähle sollte nur der Code in einer Text Datei geschrieben werden und diverse Ordner erstellt werden.

Leider ist das Problem das ich den Wert nicht zurückbekomme so wie ich Ihn benötige.

Habe, in dem Tool div. Comboboxen und rufe diese so ab.

$Vendor = $ComboBoxVendor.Text

Write-Host"$Vendor"

Dies geht aber nicht bei der Language, da anscheinend dies über TextBlocks und Grid.ColumnDefinitions läuft.

könnte mir evtl. da jemand helfen bei der Lösung des Problems.

Habe hier mal ein Code Schnipsel zusammen gebastelt von der Passage mit der Language.

 

Der Original Code ist schon ca. 1600 Zeilen und das wollte ich hier nicht reinstellen wegen der Länge.

 
Clear-Host
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
#region XAML GUI
[xml]$XAML = @'<Window x:Class="ComboBox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ComboBox"
mc:Ignorable="d"
Title="ComboBox XAML" Height="400" Width="400" WindowStartupLocation="CenterScreen" ResizeMode='NoResize'><Grid Margin="0,0,-0.2,0.2"><!-- Label --><Label x:Name="LabelLanguage" Content="Language" Margin="100,130,0,0" Width="100" Height="26" HorizontalAlignment="Left" VerticalAlignment="Top" Background="#FF98D6EB" OpacityMask="#FF3399FF" Foreground="White" FontWeight="Bold"/><Label x:Name="LabelLanguageSelected" Content="Selected Lang." Margin="100,160,0,0" Width="100" Height="26" HorizontalAlignment="Left" VerticalAlignment="Top" Background="#FF98D6EB" OpacityMask="#FF3399FF" Foreground="White" FontWeight="Bold"/><!-- Textbox, Combobox Button --><StackPanel><ComboBox x:Name="ComboboxLanguage" Margin="220,130,0,0" Width="110" Height="26" IsEditable="false" HorizontalAlignment="Left" VerticalAlignment="Top" BorderBrush="#FF3399FF" Foreground="#FF3399FF" OpacityMask="#FF3399FF" FontWeight="Bold"><ComboBoxItem><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="180"/></Grid.ColumnDefinitions><TextBlock Text="ar-SA" Grid.Column="0"/><TextBlock Text="Arabic - Saudi Arabia" Grid.Column="1"/></Grid></ComboBoxItem><ComboBoxItem><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="180"/></Grid.ColumnDefinitions><TextBlock Text="de-DE" Grid.Column="0"/><TextBlock Text="German - Germany" Grid.Column="1"/></Grid></ComboBoxItem><ComboBoxItem><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="180"/></Grid.ColumnDefinitions><TextBlock Text="en-US" Grid.Column="0"/><TextBlock Text="English - United States" Grid.Column="1"/></Grid></ComboBoxItem><ComboBoxItem><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="180"/></Grid.ColumnDefinitions><TextBlock Text="fr-FR" Grid.Column="0"/><TextBlock Text="French - France" Grid.Column="1"/></Grid></ComboBoxItem><ComboBoxItem><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="180"/></Grid.ColumnDefinitions><TextBlock Text="ja-JP" Grid.Column="0"/><TextBlock Text="Japanese - Japan" Grid.Column="1"/></Grid></ComboBoxItem><ComboBoxItem><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="180"/></Grid.ColumnDefinitions><TextBlock Text="ko-KR" Grid.Column="0"/><TextBlock Text="Korean - Korea" Grid.Column="1"/></Grid></ComboBoxItem><ComboBoxItem><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="180"/></Grid.ColumnDefinitions><TextBlock Text="pl-PL" Grid.Column="0"/><TextBlock Text="Polish - Poland" Grid.Column="1"/></Grid></ComboBoxItem><ComboBoxItem><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="180"/></Grid.ColumnDefinitions><TextBlock Text="pt-PT" Grid.Column="0"/><TextBlock Text="Portuguese - Portugal" Grid.Column="1"/></Grid></ComboBoxItem><ComboBoxItem><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="180"/></Grid.ColumnDefinitions><TextBlock Text="ru-RU" Grid.Column="0"/><TextBlock Text="Russian - Russia" Grid.Column="1"/></Grid></ComboBoxItem><ComboBoxItem><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="180"/></Grid.ColumnDefinitions><TextBlock Text="tr-TR" Grid.Column="0"/><TextBlock Text="Turkish - Turkey" Grid.Column="1"/></Grid></ComboBoxItem><ComboBoxItem><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="180"/></Grid.ColumnDefinitions><TextBlock Text="zh-CN" Grid.Column="0"/><TextBlock Text="Chinese - China" Grid.Column="1"/></Grid></ComboBoxItem><ComboBoxItem><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="180"/></Grid.ColumnDefinitions><TextBlock Text="zh-TW" Grid.Column="0"/><TextBlock Text="Chinese - Taiwan" Grid.Column="1"/></Grid></ComboBoxItem></ComboBox></StackPanel><TextBox x:Name="TextBoxLanguageSelected" Margin="220,160,0,0" Width="110" Height="26" HorizontalAlignment="Left" VerticalAlignment="Top" MaxLength="4" BorderBrush="#FF3399FF" Foreground="#FF3399FF" OpacityMask="#FF3399FF" FontWeight="Bold"/><Button x:Name="ButtonExit" Content="Exit" Margin="220,200,0,0" Width="100" Height="34" HorizontalAlignment="Left" VerticalAlignment="Top" BorderThickness="0"/><Button x:Name="ButtonReset" Content="Reset" Margin="100,200,0,0" Width="100" Height="34" HorizontalAlignment="Left" VerticalAlignment="Top" BorderThickness="0"/></Grid></Window>
'@ -replace 'mc:Ignorable="d"','' -replace "x:N",'N' -replace '^<Win.*', '<Window'
#endregion

#Read XAML
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
try{$Form=[Windows.Markup.XamlReader]::Load( $reader )}
catch{Write-Host "Unable to load Windows.Markup.XamlReader. Some possible causes for this problem include: .NET Framework is missing PowerShell must be launched with PowerShell -sta, invalid XAML code was encountered."; exit}

# Store Form Objects In PowerShell
$xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | % { Set-Variable -Name ($_.Name) -Value $Form.FindName($_.Name) -Scope Script }

#???????????????????????????????


	$ComboboxLanguage_SelectedIndexChanged = {$TextBoxLanguageSelected.text = $ComboboxLanguage}
	$ComboboxLanguage.add_SelectionChanged($ComboboxLanguage_SelectedIndexChanged)



#???????????????????????????????



#region Function Reset all inputs
Function ResetAllInputs {
		$ComboboxLanguage.Text = ""
		$TextBoxLanguageSelected.text = ""
}
#endregion

# Exit forms
$ButtonExit.Add_Click({$form.Close()})
# Reset button event
$ButtonReset.Add_Click({ResetAllInputs})


$Form.ShowDialog() | out-null

 

Vielen Dank im Voraus.

 

Gruß Markus

Replace string

$
0
0

Hallo liebe Powershell-Gemeinde,

irgendwie stehe auf dem Schlauch bei der Suche nach einer Lösung.

Ich möchte eine Datei einlesen und den Wert an Stelle 8 mit Länge 4 mit einen neuen Wert überschreiben.

Habe das mit der Funktion replace versucht jedoch überschreibt er mir ja alle Werte.

Ich möchte aber nur die Werte in Stelle (8,4) ändern.

Wie bekommt man(n) das hin?

Danke jetzt schon mal für eure Antworten

 

 

Viewing all 2314 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>