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

Parameter passing to a script

$
0
0

Hi @all,

I’m new to PowerShell and currently I’m struggling with parameter passing to my first script.

Depending on a passed parameter (-d) I want to start an external (.exe) program.

The following combinations should be possible:

  1. without parameter -d: C:\xyz\Script\ParamTest.ps1
  2. with parameter -d but no value (use the default): C:\xyz\Script\ParamTest.ps1 -d
  3. with parameter-d  and 1 value: C:\xyz\Script\ParamTest.ps1 -d 10
  4. with parameter-d  and 2 value2: C:\xyz\Script\ParamTest.ps1 -d 10,20

Whereby for:

  1. the external program should not be called,
  2. the external program will be called with default values,
  3. the external program will be called with the value passed and a default value
  4. the external program will be called with the values passed

I’ve read several pages on the Internet and - based on these information – I’ve tried several combinations for Param(…):

Variant

w/o -d

-d

-d 10

-d 10,20

[Parameter(Mandatory=$false)]

[array]$d = @(-1,-1)

Ok

X

Ok

Ok

[ValidateCount(0,2)]

Ok

X

Ok

Ok

[AllowEmptyCollection()]

Ok

X

Ok

Ok

[AllowEmptyArray()]

X

X

X

X

[AllowNull()]

Ok

X

Ok

Ok

[ValidateScript({return($true)})]

Ok

X

Ok

Ok

Ok = worked

X = didn’t work (Exception)

The problem is always the specification of –d without any value (= Exception).

The use of [ScriptBlock], DynamicParam and ParameterSet seems not to solve the a.m. problem either (?).

Is somebody out there with an idea about how to solve that problem?

Kind regards


Inhalt der aktuellen Dateien in einem Verzeichnis auslesen

$
0
0

Hallo Zusammen,

wir legen über eine Kombination von "nxlog", Powershell und Windows Task Sceduler, die mit Error/Warnung behafteten Event Logs und zwar aller 5 Minuten als "eventlog_Zeitstempel.log" in einem Verzeichnis ab. Die *.log Dateien, die älter als 60 Minuten sind werden automatisch entfernt, sodass sich immer nur 12 Dateien in diesem Verzeichnis befinden.

Mit dem Befehl " Get-Content C:\...\eventlog*.log >> Gesamtlog.csv " kann ich die aktuelle Inhalte der vorhandenen Dateien in einer CSV Datei schreiben.

Wie soll ich nun vorgehen, dass ich ab jetzt nur der Inhalt der neuen Dateien in der Gesamtlog.csv dazuschreibe? Gibt es ein Befehl oder eine Option mit Get-content, dass mit Zeitstempel arbeitet?

Danke & Gruß

Madjeed

Kann ich alle Powershellfunktionen in meinem Script gleichzeitig minimieren?

$
0
0

Morgen,

ich wollte fragen ob es einen Befehl gibt, mit dem ich alle Funktionen in meinem Script gleichzeitig minimieren kann, sodass ich nur die Funktion öffne, welche ich gerade bearbeite? Oder muss ich jede einzeln per Klick schließen ?

Danke und einen schönen Tag :)

Grüße

Funktion zur Ausgabe auf Bildschirm und gleichzeitig in eine Log-Datei

$
0
0

Hallo

ich habs fast, aber nur fast.

Ich muss in meinen Scripten bestimmte Vorgänge in einer definierten weise loggen.

Das Format sieht so aus ::<Datum,Stunden,Minuten,Sekunden> MELDUNG

Im Moment habe ich folgende Funktion

    Function LogOut ($text)
        {
        $Logfile=".\output.txt" ; $m= "::" ; $date=Get-Date -Format "dd-MM-yyyy HH:mm:ss"
        $m + $date | Out-File -FilePath $Logfile -append #-Encoding ascii
        "$text" | Tee-Object -FilePath $Logfile -append | Write-Host -ForegroundColor Yellow
        }

Wenn ich das mit LogOut -text "Dies ist ein Test" aufrufe sehe ich das auf dem Schirm, aber in der Log-Datei ist immer ein Zeilenumbruch zwischen dem Datum und dem Text.

Also siehts in der output.txt so aus

::27-10-2016 11:35:53
Dies ist ein Test


Das darf und soll nicht sein!

Egal was ich mache - ich bekomme den Zeilenumbruch nicht weg.

Wo ist mein Fehler?

Danke schon mal

User per PowerShell anlegen

$
0
0

Hallo,

ich habe mir ein kleines Script angelegt, mit diesem ich meine neuen User in der AD anlegen kann. Das Script läuft auch problemlos durch. Jedoch schaffe ich es nicht den "Namen" nachträglich zu ändern.

Hätte hier jemand einen Tipp für mich?

Danke

Powershell DHCP Reservierungsname ändern

$
0
0

Guten Tag zusammen,

Ich habe ein Script geschrieben welches die Datenbank unseres Provisioningtools anzapft und die IP adressen ausliest. gleichzeitig geht es auf das DHCP und macht einen Abgleich.

nun kenne ich mich mit dem DHCP nicht aus, und würde im weiteren Verlauf gerne den Reservierungsnamen  einiger Einträge ändern.

ich habe den Befehl:

Set-DhcpServerv4OptionValue

gefunden, kann damit aber ehrlich gesagt nicht wirklich was anfangen und möchte nicht damit "rumspielen" weil ich dass Script im laufenden Betrieb starten muss

gegeben habe ich in dem Momnent lediglich die IP und den neuen Namen

Set-RDRemoteApp - Gültige Benutzer-SID

$
0
0

Hallo,

Ich versuche gerade automatiesiert meine RDWeb Sessions verschiedenen Usern zuzuweisen.

Dabei hab ich mir einen String gebastelet "`"contos\user1`", `"contos\user2`"" den ich dann in den vorgefertigten Set-RDRemoteApp-String einfüge. Da bekomm ich jedoch diesen Fehler:

-------------------

Set-RDRemoteApp : Eine der angegebenen Benutzergruppen, ""contos\user1", "contos\user2"", konnte keiner gültigen SID zugeordnet werden.
In C:\Users\RDAdmin\Desktop\Scripting\makeAccess_v0.2.ps1:84 Zeichen:9
+         Set-RDRemoteApp -CollectionName CONTOSO-Alias wordpad -UserGroups @($($u ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Set-RDRemoteApp

------------------------

Umgesetzt habe ich das so:

function writeOutput {
        # "`"SENSIX\3509`", `"SENSIX\3385`""
        $userString = buildCmdString;

        Set-RDRemoteApp -CollectionName CONTOSE -Alias wordpad -UserGroups @($($userString));
}

Könnt ihr mir helfen?

Danke

Lg SUT_2


Neue Zeile beginnen

$
0
0

Hallo Community,

bin noch relativ unerfahren was Powershell angeht, vielleicht kann mir ja jemand helfen.

Folgendes, ich bekomme eine Ausgabe wie z.B. D003936D003936D003936D003936 .

Das ganze soll dann in einen Texblock geschrieben werden. 

Nun möchte ich aber, dass vor jedem "D" eine neue Zeile beginnt, sodass es die Nummer untereinander stehen. 

Wäre sehr dankbar wenn mir jemand helfen könnte.

Lg,

Tonnk


Aufruf eines PS1 Skripts per Verknüpfung liefert Fehler

$
0
0

Hallo zusammen,

Mein Skript läuft in der ISE einwandfrei.

Wenn ich es aber über ein Verknüpfung direkt starte, kommt es zu folgendem Fehler :

New-Object : Cannot find type [System.Windows.Forms.ToolTip]: verify that the assembly containing this type is loaded.

Hat jemand eine Idee wo ran das liegen kann?

Viele Grüße

Tim

Lokale Gruppen auslesen und ausgabe in csv

$
0
0

Hallo Zusammen,

Da ich erst gerade super hier beraten worden bin komme ich gleich mit einem weiteren problem das ich habe.  Eventuell wird die frage als sehr einfach empfunden, habe auch erst seit 2wochen mit PS beschäftigt und daher ist noch alles recht neuland.

Ziel meines Scripts soll sein alle User und Gruppen mitglieder einer/mehreren lokalen Gruppe herauszulesen und mir dann in ein csv exportiert. Ich habe einige Scripts hier und da gefunden jedoch meist das nur immer eine Gruppe herausgelesen wird. Da ich aber eine Liste habe mit über 100 Gruppen die er auslesen soll will ich nicht jedesmal die Gruppe angeben sondern er soll dies von einem existierenden File entnehmen.

$csv = Get-Content ".\group.csv"
#$group=$_


# Specify the local group.
$strGroup = $csv

# Retrieve Distinguished Name of current domain.
$Domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$Root = $Domain.GetDirectoryEntry()
$Base = ($Root.distinguishedName)



# Specify the computer.
$strComputer = "Server""Computer: $strComputer"
$result = $csv | foreach-object {
# Bind to the group object with the WinNT provider.
$Group = [ADSI]"WinNT://$strComputer/$strGroup,group""Group: $strGroup"
}

EnumLocalGroup $Group | set-content .\groupandmem.csv

Nun ist das problem sobald mein .\group.csv mehr als eine Gruppe hat gibt er gar nix aus sondern eine fehlermeldung:


Exception calling "Invoke" with "2" argument(s): "The group name could not be found.

und der Befehl:

EnumLocalGroup $Group | set-content .\groupandmem.csv 

funktioniert auch nicht, wenn ich | set-content .\groupandmem.csv entferne gibt er mir alle Informationen aus aber er schreibt sie nicht in das csv, dies bleibt leer.

Danke schon mal für eure tolle unterstützung.

Gruss

shutdown & Stop-Computer / PowerShell

$
0
0

Hallo liebes TechNet Forum.

Zur Zeit bin ich noch Schüler und unsere Aufgabe ist es uns eine individiuelle Batchdatei zu schreiben, sie zu dokumentieren und vorzutragen. Anschließend sollen wir diese Batchdatei in Powershell umfunktionieren. Allerdings hat unser Lehrer selbst nicht so die Ahnung und deshalb wende ich mich mal an Erfahrene. Mir persönlich ist der Umgang mit PowerShell neu aber ich lerne gerne und schnell dazu.

Ich habe mir eine Sleep-Timer Batchdatei erstellt, bei der gefragt wird, wann der PC heruntergefahren werden soll. Da die Konsole nur Sekundenangaben annimmt, habe ich noch eine Zeitumwandlung mit eingebaut, die mir Sekunden in Minuten umrechnet.

Alles funktioniert auch prima, nur leider weiß ich nicht wie ich diesen Schritt in der PowerShell anwenden kann.

Wenn ich mir die Parameter von "Stop-Computer" anschaue, finde ich keine Möglichkeit diese per Zeit zu steuern...

Meine zweite Idee war, den Befehl "Stop-Computer" einfach in der angegebenen Zeit ausführen zu lassen nur finde ich diese etwas Blöde... (:

Ich habe auch viel bei google gesucht nur leider nichts brauchbares gefunden, es wird lediglich immer wieder auf die Batch zurückgewiesen.

Vllt habt Ihr ja eine Lösung das wäre Super! Danke schon mal !

Hier ist meine Batchdatei:

_______________________________________________________________________________________________

@echo off
color 0A

:start
echo.
echo.
echo.
echo =============================================================
echo In wie vielen Minuten soll Ihr Computer heruntergefahren werden?
echo =============================================================
set /p min=Zeit in Minuten:
if not defined min (
  echo.
  echo Bitte geben Sie etwas ein...
  echo.
  goto start
)

set /a test = %min%*1

if %test% LEQ 0 (
  if %min% == a (
    goto cancel
  )
  echo.
  echo Zu kurz! Bitte eine längere Zeit eingeben:
  echo.
  goto start
)

set /a zeit = %min%*60
echo Shutdown in %min% Minuten
pause
shutdown.exe -s -t %zeit% -f


:cancel
cls
echo.
echo.
echo.
echo =============================================================
echo Möchten Sie den Sleep-Countdown abbrechen?
echo =============================================================
set /p antwort= (j/n)?:
If "%antwort%" == "j" (CALL :abbrechen) Else (
If "%antwort%" == "n" (CALL :exit) Else (
goto :cancel
)
)

:abbrechen
cls
echo.
echo.
echo.
echo =============================================================
echo Das Herunterfahren des Systems wird abgebrochen!
shutdown -a
echo Möchten Sie das Programm wiederholen?
echo =============================================================
set /p ok= (j/n)?:
echo.
If /i "%ok%" == "j" (CALL :start) ELSE (
If /i "%ok%" == "n" (CALL :exit2) ELSE (
cls
echo.
echo.
echo.
echo =============================================================
echo Falsche Eingabe! Bitte "j" oder "n" eingeben!
echo =============================================================
echo.
goto :abbrechen
)
)

:exit
cls
echo.
echo.
echo.
echo =============================================================
echo Ihr System wird zur gewünschten Zeit heruntergefahren.
echo Der SleepTimer wird nun beendet...
echo =============================================================
echo.
pause
exit

:exit2
cls
echo.
echo.
echo.
echo =============================================================
echo Der SleepTimer wird nun beendet...
echo =============================================================
echo.
pause
exit
______________________________________________________________________________________________

Combobox XAML auslesen

$
0
0

Hi Community,

ich habe folgendes Problem. Ich habe eine Combobox mit mehreren Inhalten. Ich möchte nun aber nicht den Inhalt herausfinden, sondern die Position vom Ausgewählten. Also z.B. das erste oder das zweite von oben oder so ähnlich. Geht das überhaupt? Und wenn ja wie? 

Vielen Dank schon mal im Vorraus. 

LG,

Tonnkful

Datum vergleichen

$
0
0

Hallo zusammen,

ich möchte alle User die heute das Passwort geändert haben. Leider werde ich mit den hunderten Anleitungen im Google auch nicht ganz schlau

am liebsten wäre mir    where {$_.PasswordLastSet -eq "2016-11-10"} aber Datum kann man ja mit string nicht vergleichen.

und mit den get-date Anleitung komm ich nicht zurecht.

get-aduser -filter * -properties * | where {(get-date $_.PasswordLastSet).date -eq (get-date).Date} | ft DisplayName,SamAccountName,passwordlastSet -autosize

kann mir jemand einen Tipp geben.


Chris

Frage zu Codebeispiel SQL-Server

$
0
0

Hi,

in einem Beispielscript (http://www.kendalvandyke.com/2013/02/t-sql-tuesday-39-use-powershell-to-copy.html) ist folgende Zeile enthalten, welche ich nicht verstehe:

New-Object-TypeNameSystem.Version-ArgumentList'8.0.0.0'|New-Variable-NameSQLServer2000-ScopeScript-OptionConstant

Das Ergebnis ist offenbar, dass in der Variable $SQLServer2000'8.0.0.0'steht. Warum macht man das so kompliziert, was ist der Vorteil davon?

Danke für die Aufklärung.

Fehler in der If-Abfrage

$
0
0

Hey zusammen,

Ich hab bei meinem Programm das einen Share erstellen soll ein Problem bei der zweiten If Abfrage.

Vorab ich bin neu was das Programmieren angeht, kann also gut sein das einiges unnötig kompliziert oder so ist ^^
Hier erstmal der Code

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

#Fenster
$form = New-Object Windows.Forms.Form
$form.text = "Share erstellen"

#Label
$label = New-Object Windows.Forms.Label
$label.Location = New-Object Drawing.Point 50,30
$label.Size = New-Object Drawing.Point 200, 15
$label.Text = "Geben Sie den Pfad an"
$form.Controls.Add($label)

#Textbar für den Pfad
$textPath = New-Object Windows.Forms.Textbox
$textPath.Location = New-Object Drawing.Point 50,60
$textPath.Size = New-Object Drawing.Point 200,30
$textPath.Text = "E:\"
$form.Controls.Add($textPath)

#Textbar für den Namen
$textName = New-Object Windows.Forms.Textbox
$textName.Location = New-Object Drawing.Point 50,60
$textName.Size = New-Object Drawing.Point 200, 30
$textName.Text = "Sharename\"

#Textbar für den Unterordner und die AD-Gruppe
$textAD = New-Object Windows.Forms.Textbox
$textAD.Location = New-Object Drawing.Point 50,60
$textAD.Size = New-Object Drawing.Point 200,30
$textAD.Text = "Unterordner"

#Pfad Variable
$Path = ($textPath.Text + $textName.Text)

#EndeKnopf
$ButtonEnd = New-Object Windows.Forms.Button
$ButtonEnd.Location = New-Object Drawing.Point 150,200
$ButtonEnd.Text = "Ende"

#Cancelknopf
$ButtonCancel = New-Object Windows.Forms.Button
$ButtonCancel.Location = New-Object Drawing.Point 150,200
$ButtonCancel.Text = "Cancel"
$ButtonCancel.Add_Click({$form.Close()})
$form.Controls.Add($ButtonCancel)

#WeiterButton Nr.3
$WeiterButton3 = New-Object Windows.Forms.Button
$WeiterButton3.Location = New-Object Drawing.Point 50,200
$WeiterButton3.Text = "Weiter"

#WeiterButton Nr.2
$WeiterButton2 = New-Object Windows.Forms.Button
$WeiterButton2.Location = New-Object Drawing.Point 50,200
$WeiterButton2.Text = "Weiter"

#WeiterButton Nr.1
$WeiterButton1 = New-Object Windows.Forms.Button
$WeiterButton1.Location = New-Object Drawing.Point 50,200
$WeiterButton1.Text = "Weiter"
$form.Controls.Add($WeiterButton1)
$WeiterButton1.Add_Click({

if (Test-Path $textPath.Text)
{
$label.Text = "Geben Sie den Sharename ein"
$form.Controls.Remove($textPath)
$form.Controls.Remove($WeiterButton1)

$form.Controls.Add($textName)
$form.Controls.Add($WeiterButton2)
}
Else
{
$label.Text = ("Der Pfad" + $textPath.Text + "konnte nicht gefunden werden")
}
})

$WeiterButton2.Add_Click({

if (Test-Path $Path)
{
$label.Text = "Der Ordner existiert bereits"
}
Else 
{
New-Item -Name $textName.Text -ItemType directory -Path $textPath.Text

$form.Controls.Remove($textName)
$form.Controls.Remove($WeiterButton2)
}

})

$form.ShowDialog()

Bei der ersten funktioniert Alles super, ich gebe einen korrekten Pfad ein und er macht weiter, ich gebe einen falschen ein und er ändert nur den Text in "Pfad nicht vorhanden"

Bei der zweiten jedoch erstellt er wenn der Ordner nicht existiert den Ordner, soweit in Ordnung, Wenn der Ordner jedoch bereits existiert ändert er nicht den Label  Text zu "Ordner existiert bereits" Nur unten im Konsolenbereich wird mir angezeigt das der Ordner nicht existiert.

Habt ihr ne Idee wo ich mich verhaspelt habe ?


Verzeichnisscript - Logfiles vergleichen und auswerten

$
0
0

Hallo zusammen

Um Änderungen in den Parentfolders zu erkennen, lasse ich ein Script durchlaufen, das alle Ordner bis zur dritten Ebene in ein Logfile speichert. Das erste Logfile ist sozusagen das Original, da in diesem Logfile die Ordnerstruktur stimmt. Nun habe ich ein Script erstellt, das nochmal die Verzeichnisse durchsucht und in ein zweites Logfile speichert. Nun will ich, das das erste Logfile (Original/Standard) mit dem neu erstellten Logfile verglichen wird. Ein drittes Logfile soll erscheinen, um Änderungen zu erkennen.

Der Quellcode bis jetzt:

gci G:\*\*\* -filter * |

? { $_.PSisContainer -eq $true} |

% {$_.fullname -replace "\\","`t" } |

sort | out-file C:\Users\Benutzer1\Desktop\TestScript\LogFile.txt

compare ((Get-Content "C:\Users\Benutzer1\Desktop\Standard.txt") -replace "(\s)+",'$1') ((Get-Content "C:\Users\Benutzer1\Desktop\TestScript\LogFile.txt") -replace "(\s)+",'$1')

sort | out-file C:\Users\Benutzer1\Desktop\TestScript\LogFileVergleich.txt

Problem:

Wenn ich es in der PowerShell ISE durchlaufen lasse, werden Änderungen angezeigt. Jedoch schreibt es diese Änderungen nicht in das dritte gewünschte Logfile. Wieso nicht? Kann mir da jemand behilflich sein?

Wäre sehr dankbar für schnelle Antworten.


import feste breite, oder regulär Expression replace white space

$
0
0

hallo zusammen,

kann ich beim Import-csv angeben, dass ich eine feste breite (so wie in Excel) habe? oder muss man im Nachhinein aufwendig die Lesezeichen ersetzen, was gar nicht so einfach ist, wie ich jetzt nach einer Stunde google feststellen musste.

Aufgabe (in Excel kein Problem - falls es mit Powershell nicht einfach geht)

ich bekommen eine solch ähnliche  Datei mit nachfolgenden Aufbau die dann weiterverarbeitet wird.

Beispiel (Spalte 1 keine Leerzeichen, dann beliebe Leezeichen)

word               Microsoft Word

Excel               Microsoft Excel

AdobeReader    Adobe Reader 9.0

der Import sollte als ab Position für das zweite Feld beginnen

oder muss man es nachher formatieren auch nicht so einfach

mit -replace "\s+","; "

macht

word;Microsoft;Word  ich brauche aber zwei Properties (heißt es glaube ich in Powershell)

word;Microsoft Word


Chris

Ausgabe des belegten Speicherplatzes von Servern einer bestimmten OU

$
0
0

Hallo Zusammen, 

für die Berechnung des BackUps möchte ich den Belegten Speicher der Server einer bestimmten OU auslesen und in eine CSV Datei exportieren.

Mit:

get-WmiObject win32_logicaldisk -Computername Musterserver| % {$_.name, ($_.size / 1GB), ($_.freespace / 1GB) }

schaffe ich es die Dateien einzelner Server auszulesen. 

Kann mir einer von Euch behilflich sein ?

Viele Grüße

Torsten


Verzeichnisgröße ermitteln, Get-ChildItem, sort

$
0
0

Hallo ihr Powershell Gurus.

ich haben eine Code gefunden und den angepasst und hätte 3 Fragen

$RootVz = Get-ChildItem -directory c:\temp
foreach ($i in $RootVz)
{
$Groesse = (Get-ChildItem "c:\$i\AppData" -Recurse | measure -property length -Sum)
"{0:N2}" -f ($Groesse.sum/1MB) + "MB,$i"
}

funktioniert so weit so gut. Wenn ich den Verzeichnisnamen vorne haben möchte geht es nicht.

"{0:N2}" -f ($Groesse.sum/1MB) + "MB,$i"

"$i","{0:N2}" -f ($Groesse.sum/1MB) + "MB"             ==> Verzeichnisname am Anfang geht nicht?

2.) was bedeutet {0:N2}

3. wenn ich das Ergebnis sortieren möchte (ich habe es jetzt in Excel sortiert - möchte aber für künftig dazulernen), müsste ich vermutlich die foreach Schleife einer Variable bzw. Objekt zuweisen - oder? Wie müsste der code da aussehen, wo steht das | sort, nach was sortiere ich? length = ja nicht die Summe die mir die foreach zurückliefert? Ich hoffe ich konnte mich etwas verständlich ausdrücken

$a = foreach ($i in $RootVz)


Chris

CSV-Datei auslesen, um net use Befehl aufzubauen

$
0
0

Hallo zusammen,

folgendes Problem:

Es gibt eine per Semikolon getrennte TXT-Datei, in der Username1;Username2;Passwort;LW;Pfad stehen.

Ich möchte nun ein Script bauen, welches mit einen Net Use Befehl aufbaut, indem die CSV nach dem Username1 (entspricht dem aktuell in Windows angemeldeten User) durchsucht wird. Für das Verbinden mit dem Laufwerk sollen dann LW, Pfad, Username2 und Passwort verwendet werden.

Wie stelle ich das grundsätzlich an, dass mir die entsprechende Zeile gesucht wird und wie baue ich den Befehl dann auf?

Vielen Dank schonmal!

Philipp

Viewing all 2314 articles
Browse latest View live


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