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

Bestimmte Spalten einer Datei in eine neue Datei schreiben

$
0
0

Guten Morgen allerseits.

Ich mache gerade ein Fernstudium im bereich Netzwerkadministrator. Derzeit bin ich im Bereich Powershell

Als Aufgabe habe ich nun folgendes Bekommen.

Ich soll ein Programm erstellen das aus einer txt datei die 5te Spalte einer jeden Zeile auslesen und in eine andere Datei schreiben soll.

Hierfür bin ich mittlerweile soweit gekommen.

#Abfrage der Datei welche eingelsen werden soll
$file = Read-Host "Welche Datei soll eingelesen werden?"

#Abfrage welche Spalte gelesen werden soll
$spalte = Read-Host "Welche Spaltes soll gelesen werden ?"

#Wie Lautet die Ausgabe Datei
$new = Read-Host "In welcher Datei soll das Ergebnis Gespeichert werden?"

#Inhalt der Datei die beschrieben werden soll leeren
Clear-Content -Path $new

#Wert aus der Datei auslesen. Reihe für reihe und immer spalte x die vorher deklariert wird.
$n = 1
while( $n -lt 7)
    {
    $ausgabe += @((Get-Content -Path $file)[$n][$spalte])
    $n++
    }

#Ausgabe in der Datei

while($r -lt 7)
    {
    Add-Content -path $new -value $ausgabe[$r]
    $r++
    }

#Ausgabe der Einträge die geschrieben wurden.
Get-Content -path $new

#Array Löschen
$ausgabe = $null

Das Problem ist das die Spalte nicht ins Array geschrieben wird und das später auch die Werte nicht direkt in die neue Datei geschrieben werden. Das Script fordert mich auf Value[0] usw von Hand einzugeben.

MFG

Der Sebastian




String kürzen

$
0
0

Hallo,

ich habe eine IP Adresse die ich gerne ab dem letzten "." abschneiden möchte um das Netz zu ermitteln.

$Computername = "PC160001"
$ipAddresses = [System.Net.Dns]::GetHostAddresses($Computername) | %{$_.IPAddressToString}
$split = $ipAddresses.split(".")
$_IP = $split[0] + "." + $split[1] + "." + $split[2]
$_IP

Funktion prima. Gibt es einen einfacheren Weg ?

Liebe Grüße

Norbert


IT Berater

Output Funktion

$
0
0

Hallo,

wahrscheinlich einfache Frage - ich stehe aber auf dem Schlauch. Ich möchte eine Skript erstellen, welches die Rückgabe von mehreren Cmdlets in ein Json File exportiert.

Um das ganze etwas einfach zu gestalten möchte ich hierzu eine kleine Funktion schreiben die den Output des Cmdlets nimmt und ihn in ein JSON File umwandelt ( z.B. get-service | convertto-json | out-file) . Wie kriege ich es hin das meine Funktion den Pipelineinput verwenden kann. Was immer da auch kommen mag....

Dies ist das Grobe Ziel:

#Funktion für Ausgabe von INput in JSON
function out-json
{
 $_ | convertto-json | out-file
}

get-service | out-json
get-aduser | out-json
Bin für alle Tips dankbar.

Viele Grüße

Thomas

Windows Dienst überwachen und Mail verschicken, wenn Dienst beendet

$
0
0

Hallo Zusammen,

ich versuche ein Skript zu schreiben, das jede Minute überprüft, ob ein Dienst läuft. Wenn dieser nicht gestartet ist, soll eine E-Mail verschickt werden. Ich habe folgenden Skript getestet, funktioniert aber nicht 100%ig:

$servicename="PeerDistSvc" #Dienstname
$timespan = New-Object System.TimeSpan(0,1,0) #Stunden,Minuten,Sekunden
$scope = New-Object System.Management.ManagementScope("\\.\root\cimV2")
$query = New-Object System.Management.WQLEventQuery ("__InstanceModificationEvent",$timespan, "TargetInstance ISA 'Win32_service'" )
$watcher = New-Object System.Management.ManagementEventWatcher($scope,$query)


do
    {
        $b = $watcher.WaitForNextEvent()

        $b.TargetInstance.Name
        $b.TargetInstance.caption     # Eigenschaftenn der WMI-Klasse: win32_service
        if ($(get-service -name $servicename).status -eq "Stopped") {
          start-service -name $servicename

		  Send-MailMessage -smtpServer server fqdn -From admin@ab.loc -To user@ab.loc -Subject 'Dienst auf Server XX-01 unerwartet beendet. Dienst wurde neugestartet' -Body "Body content"
        }

    }
while ($a -ne 1)

Danke
edstylo


192.168.178.021 und 192.168.178.21 vergleichen

$
0
0

Hallo,

ich möchte zwei Zahlen vergleichen. Die erste Zahl hat immer 3 Stellen zwischen den Punkten. Bei der zweiten Zahl wir eine 0 die an Anfang seht nicht angezeigt.

Gibt es einen Weg diese Zahlen trotzdem zu vergleichen oder muss ich die Zahl anpassen damit ich sie vergleichen kann?

Liebe grüße

Norbert


IT Berater

nicht anzeigen wenn ...

$
0
0

Hallo,

ich frage verschiedene Gruppen ab, diese möchte ich Filtern. Es sollen zum einen nur Gruppen angezeigt werden die mit "SG_" anfangen. Dies funktioniert schon mal gut:

$MyStaticGroups = $MyComputer.GetMemberships("Static") | Where-Object {$_.Name -like “SG_*”}

Nun möchte ich Gruppen ausklammern, die *Verteilung* im Namen haben. Wie mache ich das?

Liebe Grüße

Norbert


IT Berater

XML Config auslesen und in 2-Dimensionales Array

$
0
0

Hallo,

ich habe eine XML Datei als Config File:

<?xml version="1.0" encoding="utf-8"?><co><config><setting name="Set1" value="Test123"></setting></config><kunden><kunde name="Kundenname1"></kunde><kunde name="Kundenname2"></kunde></kunden></co>

Ist natürlich nur die abgespeckte Version ich habe bis zu 40+ Kunden.

Mit dem Powershell Befehl:

$CountKunde = $config.SelectNodes("//co/kunden/kunde").Count

So wird die Anzahl der Kunden gespeichert.

SO - nun will ich aber das ich ein Array(2-Dimensional) mit den Namen aus der Config fülle.

->Warum zwei Dimensional ich möchte in die erste Splate den Kundennamen speichern und in die zweite Spalte die Mitarbeiter.

Ich hänge jetzt daran, die Namen aus der Config auszulesen und die erste Splate vom Array zu speichern, ich weiß das ich über §Array[,] ein zwei dimensionales Array erstellen kann, aber ich möchte es später befüllen.

Ich zeig euch das mal:

-> Array Vorhanden

-> Array[0][0] - Enthält Kundenname1 ; Array [0][1] - Enthält Kundenname2 ; Array [0][2] - Enthält Kundenname3

-> Später will ich dann über Array[1][0] - Mitarbeiter1 einfügen ; Array[1][1] - Mitarbeiter2 einfügen ; Array[1][2] - Mitarbeiter3 einfügen

Im Moment würde ich das über zwei Schleifen machen, aber wenn Ihr ein weg habt nur über eine das zu lösen wäre das auch nett. Ich weiß leider sehr wenig über PowerShell habe mir das meiste zusammen gegooglte, weiß daher nicht genau wie ich das umsetzen soll. Daher frage ich euch, die mehr Ahnung von PowerShell haben und mir eventuel helfen könnten.

Ich freue mich über jede Hilfe.

Danke

IP-Adressen vergleichen

$
0
0

Hallo,

ich möchte zwei Zahlen vergleichen. Die erste Zahl hat immer 3 Stellen zwischen den Punkten. Bei der zweiten Zahl wir eine 0 die an Anfang seht nicht angezeigt.

Gibt es einen Weg diese Zahlen trotzdem zu vergleichen oder muss ich die Zahl anpassen damit ich sie vergleichen kann?

Liebe grüße

Norbert


IT Berater



Daten in der Pipeline filtern

$
0
0

Hallo,

ich frage verschiedene Gruppen ab, diese möchte ich Filtern. Es sollen zum einen nur Gruppen angezeigt werden die mit "SG_" anfangen. Dies funktioniert schon mal gut:

$MyStaticGroups = $MyComputer.GetMemberships("Static") | Where-Object {$_.Name -like “SG_*”}

Nun möchte ich Gruppen ausklammern, die *Verteilung* im Namen haben. Wie mache ich das?

Liebe Grüße

Norbert


IT Berater


Zeile suchen, Zeile anpassen und Zeile speichern

$
0
0

Hi,

ich stehe im Moment auf dem Schlauch. Weiß einfach nicht mehr weiter. Also ich habe eine Datei diese beinhaltet 19 Zeilen, davon relevant sind 15 Zeilen. Jede Relevante Zeile hat ein bestimmten String wonach ich suchen kann, damit ich die Zeile auch identifizieren kann.

Mit diesen Code kann ich nach der Bestimmten Zeile suchen:

foreach($zeile IN Get-Content "myPath")
{
if($zeile | Where-Object { $_.Contains("Suche")})
{
$logZeile = $logZeile + " - Die Zeile soll geändert werden!"
Write-Host "$logZeile"
}
}

Doch wie kann ich nun die veränderte Zeile in die schon bestehende txt-Datei zurück speichern?

Danke für die Hilfe

Liebe Grüße

Automatischer Neustart eines Background Jobs

$
0
0

Guten Tag!

Ich habe einen Background Job der folgendermassen aussieht:

$targets = "firefox","outlook"

foreach ($target in $targets)
{
    Start-Job -name $target -ArgumentList $target {
        param($target)
        while ((Get-Process $target).Responding) {sleep -Milliseconds 50}
        if (!(Get-Process $target).Responding)
        {
            # Do Stuff
        }
    } | out-null
}

Wie starte ich den Job neu sobald er "completed" ist?

Mit "Wait-Job | Receive-Job | Resume-Job" scheint es nicht zu funktionieren.

Danke für eure Hilfe


Windows 10 Upgrade rückgängig mache

$
0
0
Hallo, ich möchte das Windows 10 wieder Löschen und zu Windows 7 zurück setzen,

TEXTBOX ausgabe evtl. Array?

$
0
0

Hallo bzw. guten Abend,

Habe ein Problem mit der TEXTBOX eingabe bzw. mit der Ausgabe

Ausgangspunkt ist folgernder.

eine TEST.XML wo unteranderem dieses drinsteht

<closeProcess>XXXXPROCESSXXXX</closeProcess>

Nun habe ich eine TEXTBOX in PS wo man nun alle Prozesse eingeben kann, die man beenden möchte.

Die Eingabe ist getrennt durch ein Leerzeichen ohne Erweiterung

outlook word excel

Wenn ich nun den Button OK drücke, wird am Ende noch die Erweiterungen angehangen.

Damit bekomme ich dann auch die Werte.

outlook.exe word.exe excel.exe

(Die Trennung warum die Eingabe ohne Erweiterung ist, liegt daran das ich diese Information noch für andere Dateien benötige.)

Nun, würde ich noch dass, diese Werte auch in der XML Datei stehen, in etwa so.

<dialog1>Diese Prozesse XXXPROZESSEXXX werden geschlossen</dialog1>

 

<closeProcess>outlook.exe</closeProcess>

<closeProcess>word.exe</closeProcess>

<closeProcess>excel.exe</closeProcess>

 

mit foreach und replace kann ich den Eintrag für <dialog1> ändern.

Aber ich bekomme es nicht hin, dass er mir aus der TEXTBOX die Werte trennt und diese dann untereinander abspeichert, bzw. ändert.

Ich habe gelesen dass man das evtl. mit einem array hinbekommen könnte aber ich stelle mich irgendwie zu B…. an.

So wie es sein sollte.

 

Könnt Ihr mir bitte helfen ggf. einen Tipp geben?

Guss

Markus

Zeilen in XML zählen und löschen bis auf 1

$
0
0
 

Hallo liebe Leut'

hab da ein Problem, wo ich einfach nicht mehr weiter komme.
Für viele von Euch mag dies vielleicht Peanuts sein, aber für
für mich als Laie - der dem Englischen auch nicht so mächtig
ist - zur Zeit nicht lösbar.
Auch nach stundenlangen Recherchen im Internet.

Also ich habe eine .nfo Datei mit einem XML-Schema.
In dieser Datei möchte ich von einer Art bestimmten Knoten,
"<thumb>" die Anzahl ermitteln und alle löschen bis auf eins.
Dies kann der erste, der letzte oder mitten drin <thumb> sein.
Und diese befinden sich in variablen Dateien.

Also die .nfo ist so aufgebaut:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<movie>
  <tagline>diese Zeile soll nicht gelöscht werden</tagline>
 
  <thumb>nur eine von diesen Zeilen mit "thumb" soll übrig bleiben</thumb>
  <thumb>die Anzahl variert aber</thumb>
  <thumb>manchmal stehen hier nur 3</thumb>
  <thumb>dann wieder 10 Zeilen</thumb>
 
  <Set>dies darf dann auch nicht gelöscht werden</set>
</movie>


Wenn ich nun mit folgenden Befehl die Zeilen zähle:

$path = 'Pfad zur Datei\DiesIstMeine.nfo'

# Laden der Datei in den Zwischenspeicher
$xml = [xml](Get-Content $Path)

$xml.movie.thumb.count

bekomme ich zwar die Anzahl gezeigt, aber wie
kann ich dann die nicht benötigten Zeilen löschen?

Habt Ihr da eine Idee?

Auf Eure Antworten bin ich sehr gespannt.

Lg
Svensus

Hilfe bei Variablen-Scope benötigt

$
0
0

Hallo zusammen,

ich (Powershell Anfänger) bräuchte Hilfe….

Also ich habe eine FileSystemWatcher Funktion mit der ich mehrere Dateien überwache.

functionNew-FSWatcher {

 

     #region Parameters

     [CmdletBinding()]

     param (

          [Scriptblock]$EventAction,

          [String]$Event="Changed",

          [String]$FileFilter="*.*",

          [System.IO.FileInfo]$FilePathToWatch,

          [System.IO.NotifyFilters]$NotifyFilter="LastWrite",

          [Switch]$Recurse

     )

     #endregion Parameters

    

     try {

         $FileSystemWatcher=New-ObjectSystem.IO.FileSystemWatcher

         $FileSystemWatcher.Path=$FilePathToWatch

         $FileSystemWatcher.Filter=$FileFilter

         $FileSystemWatcher.NotifyFilter=$NotifyFilter

         $FileSystemWatcher.IncludeSubdirectories=$Recurse

         $FileSystemWatcher.EnableRaisingEvents=$true

         $PSO=New-ObjectPSObject-property @{Action=$EventAction}

         $FSW=Register-ObjectEvent-InputObject$FileSystemWatcher-Event$Event-MessageData$PSO-Action ({

                &$Event.MessageData.Action

          }) |Out-Null

     }

     catch {Write-Host"Fehler"}   

}

Mein “Problem“ am FileSystemWatcher ist, dass dieser in einem eigenen Scope läuft und ich Globale Variablen vermeiden möchte. Ich habe mir beholfen, indem ich die Aktion in ein Objekt lade.

$PSO=New-ObjectPSObject-property @{Action=$EventAction}

Hier ein kleines Beispiel:

$AllFilePath= @("C:\File1.txt","C:\ File2.txt ")

 

$Script:Wert1= 1

$Script:Wert2= 2

 

$Action= {

     Write-Host$Script:Wert1

     Write-Host$Script:Wert2

     $Script:Wert3=$Script:Wert1+$Script:Wert2

     Write-verbose$Script:Wert3

}

 

foreach ($FilePathin$AllFilePath) {

     New-FSWatcher-FilePath (Split-Path$FilePath)-FileFilter (Split-Path$FilePath-Leaf)-EventAction$Action

}

Soweit funktioniert das auch alles, wenn ich das Skript im Editor ausführe. Versuche ich aber das Skript im Arbeitsplatz per "Rechtsklick - Mit Powershell ausführen" zu starten, sind die Variablen nicht gefüllt. Besteht hier irgendein Unterschied wie das Skript ausgeführt wird? Und hat vielleicht einer eine Idee wie ich mir behelfen könnte? 

Schon mal vielen Dank


Variable aus Funktion übergeben

$
0
0

Hallo,

ich habe dieses kleine Script:

function checkADGroups([string]$Computername, [string]$_Netz_DNS){
    $_ = Get-ADComputer -Identity $Computername -Properties *
    $_ = $_.MemberOf
    $_ = $_ -replace "\,[^\.]*$"
    $_ = $_ -replace "(?<=\.)0+"
    $_ = $_ -replace "(?<=\.)0+"
    $_ = $_.Substring(3)
    Foreach ($Gruppe in $_) {
            If($Gruppe -eq $_Netz_DNS){
                $global:Netz_OK = "1"
                $global:Netz_AD = $Gruppe
                Break}
            Else {$global:Netz_OK = 2}}}

$Netz_OK = $Null
$Netz_AD = $Null
$Gruppe = $Null


cls
checkADGroups PC160001 192.168.112

$Netz_OK
$Netz_AD
$Gruppe

starte ich das Script über Powershell ISE, dann funktioniert alles prima.

Starte ich das Script via RunAs Test001.ps1, so wird die Variable nicht aus der Funktion übergeben. Woran kann das liegen?

Liebe Grüße

Norbert


IT Berater

AD Attribut otherPager aus csv importieren

$
0
0

Hallo Forum,

hab keine Plan von Powershell und versuch schon geraume Zeit mir Infos für ein spezielles Problem zu googlen.

Leider mit geringem Erfolg. Vielleicht kann mir hier jemand helfen.

Ich möchte aus einer csv Datei (Zeile1=user,nummer Zeile2=technik,12345678) Werte auslesen und ein beliebiges AD-Attribut (hier am Beispiel otherPager) damit befüllen.

Folgendes hab ich ja schon mal geschafft:

$userInstance = Get-ADUser -Identity technik
$userInstance.otherPager = 12345678
Set-ADUser -Instance $userInstance

Der Wert wird erfolgreich geändert.

Pack ich das ganze nun in eine Schleife mit Abfrage einer CSV geht's nicht:

$Import=Import-CSV "c:\Test\import.csv"
Foreach ($User in $Import)
         {   $userInstance = Get-ADUser -Identity $user
              $userInstance.otherPager = $User.nummer
              Set-ADUser -Instance $userInstance
         }

Vielleicht kann mir jemand helfen. Vielen Dank.

Grüsse aus MUC

AnZim


Powershell remove-item

$
0
0

Hallo zusammen.

Wie kann man in Powershell folgende Abfrage (mit Nein) automatisieren?

Mit folgenden Befehl suche ich nach leeren Ordnern die ein gewisses Alter haben.

$zuLoeschendeOrdner = Get-ChildItem -Path $Ordner -Recurse -Force | Where-Object { $_.PSIsContainer -and $_.CreationTime -lt $Alter -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | select Fullname
und lösche diese anschließend
if ($zuLoeschendeOrdner -eq $null) {"Keine Ordner gefunden, die älter sind als '$Alter'" | Out-File $Log -Append
    } else {
        $zuLoeschendeOrdner | Out-File $Log -Append
        foreach ($Element in $zuLoeschendeOrdner)
            {
                remove-item $Element.fullname -Confirm:$false
            }
        }

Jedoch erhalte ich obige Abfrage (siehe Bild). Wenn ich bei "remove-Item" den Parameter -recursive hinzufüge, wird der Ordner gelöscht. Jedoch benötige ich genau das Gegenteil.

P.S. Wie kann ich direkt bei remove-item den Output in die Logdatei schreiben?

Bisher lass ich die zu löschende Ordner vor dem löschen in die Logdatei schreiben, da "remove-item $Element.fullname -Recurse -Confirm:$false | Out-File $Log -Append" leider nicht funktioniert!?


Set-FSRM fügt nichts ein

$
0
0

Moin Moin,

derzeit versuche ich via Set-FSRMSetting den SMTP-Server, sowie die Admin E-Mail-Adresse für den Ressourcen-Manager für Dateiserver zu setzen. Allerdings zeigt sich der davon unberührt und fügt einfach gar nichts ein. Getestet wurde auf verschiedenen Servern.Folgenden Powershell-Befehl verwende ich:

 Set-FsrmSetting -SmtpServer 'mail@contoso.com' -AdminEmailAddress 'E-Mail@contoso.com'

Es kommt auch keine Fehlermeldung zurück, sondern läuft einfach durch.

Über die GUI wird es angenommen. Ich muss das allerdings auf diversen Servern durchführen.

Vielleicht hat jemand von euch nen Tipp!

Danke


Wie könnte man auf "*.Locky" reagieren?

$
0
0

Hallo,

ich hab auf unserem File-Server die  "Dateiüberprüfungsverwaltung" so eingestellt, dass bei einer Änderung einer Datei zu *.locky (und noch ein paar anderen Endungen) das verhindert wird, ein Eintrag in das Ereignisprotokoll geschrieben wird und mir über ein startendes Powershell-Script eine Mail mit Informationen zur Datei und zum Nutzer geschickt wird.

Ich würde jetzt gerne den befallenen  Rechner automatisch vom Netz nehmen, trennen oder zumindest ihn von der Freigabe trennen. Leider sind nicht alle Rechner in unserer Domäne, dann könnte man sie leicht remote abschießen, auch ist es nicht möglich die aktive Freigabe zu beenden in dem man den Nutzer sperrt oder deaktiviert (klappt zumindest bei mir nicht), die Verbindung bleibt bestehen.

Was ich gerne machen würde ist, die Session der Verbindung auf dem Server finden und trennen, die IP des Rechners in den FW eintragen und sperren oder eine andere Idee (außer den gesamten Fileserver herunterfahren)?

Natürlich haben wir schon die üblichen Maßnahmen ergriffen, es geht um eine Minimierung des Schadens wenn das Kind doch noch in den Brunnen fällt.

 

MfG

Viewing all 2314 articles
Browse latest View live


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