2016-05-06 20 views
3

Ich habe ein Powershell-Skript, das einige Aufgaben in Active Directory und MS Exchange abschließt. Ich muss den Active Directory-Benutzernamen von unserem Anrufprotokollierungssystem übergeben. Das Call-Log-System das Argument übergeben ist einfach.Argument in Powershell übergeben

Das Problem, mit dem ich konfrontiert bin, hat Powershell lesen das Argument in eine Variable.

Ich werde ein Beweis des Konzeptbeispiels zur Verfügung stellen.

Hier ist ein Beispielbefehl, der das Argument in Powershell übergibt. Hier

C:\Users\UserName\Desktop\Test.ps1 -ADusername "Hello World" 

ist das Beispielskript:

Param([string]$adusername) 
$adusername 
pause 

Ich erwarte die folgende Ausgabe:

Hello World 
Press Enter to continue...: 

Dies ist der tatsächliche Ausgang:

Press Enter to continue...: 

gerade schlang meine Kopf um dieses Kernkonzept wil Ich helfe mir sehr. Ich konnte keine Beispiele oder Anleitungen finden, die funktionierten, wenn sie auf mein Szenario angewendet wurden. Ich entschuldige mich, wenn dies ein doppelter Beitrag ist, konnte auch auf dieser Seite nichts finden.

EDIT: pro Anfrage, das ist mein ganzes Skript: http://pastebin.com/ktjpLQek

+1

Wo laufen Sie das Skript aus? Es funktioniert von Powershell für mich. (Obwohl ich powershell 5.0 noch nicht benutze.) –

+0

@EtanReisner es scheint auch gut für mich auf 2 zu funktionieren. Ich habe gefunden, dass calling params eine merkwürdige Angelegenheit ist, ohne PowerShell zuerst zu nennen, und oft bestellt $ args [x] scheint die einfachste Route (besonders für einen arg) ... –

+0

@AustinFrench Was meinst du "ohne Powershell zuerst" ? Du meinst von versuchen, ein Powershell-Skript von 'cmd.exe' oder etwas direkt zu starten? –

Antwort

6

Ich glaube, Sie haben viel wird Viel Glück, wenn Sie vermeiden, Params zu verwenden und das Skript genau so zu verwenden.

Es ist möglich, aber Paramater besser funktionieren, wenn Sie entweder die Skript-Inline wie:

. .\scriptFile.ps1 
function "Hello World" 

Bleiben Sie näher an, was man jedoch tun, sollten Sie $ args und Aufruf Powershell (die exe verwenden direkt)

Wenn Sie Ihr Skript-Aufruf wie: (I die runbox verwendet)

powershell c:\Path\Folder\Script.ps1 "Hello World!" 

und dann repl ace Ihre Param([string]$adusername) mit:

$adUserName = $args[0] 
write-host $adUserName 

Zusätzlich sollte diese Arbeit für Sie (sezieren):

Param([string]$ad) 

Write-Host $args[0] 
Write-Host $ad 

Read-Host 
pause 

Rufen Sie das Skript mit dem Pfad, Power c:\Path\Folder\Script.ps1 "Hello World!" $ad = "JSmith"

Wenn dies nicht funktioniert, , sollten Sie sicherstellen, dass Ihre Ausführungsrichtlinie korrekt festgelegt ist. Get-ExecutionPolicy wird Ihnen den aktuellen Level mitteilen. Zum Testen können Sie es sehr niedrig setzen mit

+0

Dies scheint nur zeitweise zu arbeiten. Ich werde dies am Montag noch einmal Revue passieren lassen, da ich meine Wohnung fertig machen muss. Hier ist mein komplettes Skript: http://pastebin.com/ktjpLQek – mttp1990

+0

Dies funktionierte nur einmal, so dass der Proof of Concept funktioniert, ich werde dies als beantwortet markieren. Ich bin immer noch ratlos, warum es nicht für mich funktioniert. – mttp1990

+1

@ mttp1990 Ich bin ein bisschen verwirrt über ein "es hat einmal funktioniert" ... Hast du die Skriptdatei oder irgendetwas verschoben? Was sind deine Ausführungsrichtlinien? –

0

Die folgende in einem neuen Skript für mich funktioniert.

Param([string]$servers) 
"You chose $servers" 

PS C: \ scripts> \ Untitled1.ps1 "dieser Test"

Sie diesen Test

PS C gewählt. \ Scripts>

+0

Also replizierte ich Ihr Skript an meinem Ende und meine Ausgabe zeigt nicht die String-Variable. Ich bekomme nur "You Chose" – mttp1990

+0

Können Sie Ihr Skript auf pastebin.com einfügen und teilen? Diese 'Param'-Notation funktioniert und ich habe Powershell v5 installiert. '$ PSVersionTable.PSVersion' – user4317867

+0

@ user4317867 pro Anfrage ist dies mein vollständiges Skript http://pastebin.com/ktjpLQek – mttp1990

0

Fügen Sie die folgenden an den Anfang Ihres Skripts.

Param(
    [Parameter(Mandatory=$true)] 
    [string]$Euser 
) 

Write-Host "Deactivating $EUser" 

aufrufen Beispiel nach cd in das Skriptverzeichnis

.\ScriptName.ps1 -Euser "FOO" # Tab auto completion works 
+0

Wenn ich dies tue, fordert es mich auf, den erwarteten Parameter mit dem laufenden Skriptfenster einzugeben, dies sagt mir, dass kein Argument an das Skript übergeben wurde und weil wir den Parameter als obligatorisch aufgelistet haben, scheint er etwas zu erwarten. – mttp1990

Verwandte Themen