webentwicklung-frage-antwort-db.com.de

Powershell: Es kann kein Positionsparameter gefunden werden, der das Argument "xxx" akzeptiert.

Ich versuche zu verstehen, was dieser Fehler tatsächlich bedeutet. Eine Suche nach ähnlichen Hilfeanforderungen für diesen Fehler reicht bisher von fehlenden Parametern, fehlenden Pipes, der Verwendung von Einzel- oder Mehrfachleitungen und auch Verkettungsproblemen, aber keine der Antworten scheint einen endgültigen Grund zu geben. Ich gehe also davon aus, dass das Problem das Code-Format ist (was es viel schwieriger macht, es aufzuspüren).

Dies ist mein Skript, das ich schreibe, um Active Directory-Benutzer pro Ziel-Organisationseinheit aus dem Format, in dem sie jetzt vorliegen, in ein Vorname.Nachname-Format umzubenennen.

Ich habe in AD eine Test-OU mit einigen Benutzern erstellt, die Fehler auslöst und andere nicht. Die Benutzer, die mir keinen Fehler geben sollten, geben jedoch den Hinweis "Es kann kein Positionsparameter gefunden werden, der Argumente" firstname.surname "akzeptiert. 

Ich kann nicht erkennen, was mit dem Skript nicht stimmt, aber hoffentlich kann mir jemand Hinweise geben.

Import-Module ActiveDirectory

$users = $null

$users = Get-ADUser -SearchBase "ou=Testing,ou=Users,dc=my,dc=domain" -Filter * -Properties *
ForEach($user in $users)  
{
Write-Host "Processing... $($user)"
$newname = $null

# Check first/last name is set
if (!$user.givenName -or !$user.Surname)
{
  Write-Host "$($user) does not have first name or last name set. Please correct, skipping user."
  continue
} else {
  $newname = ("$($user.givenName).$($user.Surname)")

  #Check if new username already exists
  if (dsquery user -samid $newname) {
     Write-Host "$($user) requires altered username with initial."

     if (!$user.Initials) {
        Write-Host "$($user) does not have any initials set. Please correct, skipping user."
        continue
     } 

     $newname = ("$($user.givenName)$($user.Initials).$($user.Surname)")

     #Check if altered new username already exists
     if (dsquery user -samid $newname) {
        Write-Host "$($user) requires manual change. Please correct, skipping user."
        continue
     }
  }

  Try {
   #Change UPN
       Set-ADUser $user -userPrincipalName = $newname
       #Change DN
       Rename-ADObject -identity $user -Newname $newname
  } Catch {
       Write-Host "Error when renaming $($user). Error is: $($_.Exception.Message). User requires manual change. Please correct, skipping user."
       continue
  }
}

}

14
David Hirst

Cmdlets in Powershell akzeptieren eine Reihe von Argumenten. Wenn diese Argumente definiert sind, können Sie für jedes Argument eine Position definieren.

Auf diese Weise können Sie ein Cmdlet aufrufen, ohne den Parameternamen anzugeben. Für das folgende Cmdlet ist das Pfadattribut mit der Position 0 definiert, sodass Sie beim Aufrufen die Eingabe von -Path überspringen können. In diesem Fall funktionieren beide der Folgenden.

Get-Item -Path C:\temp\thing.txt
Get-Item C:\temp\thing.txt

Wenn Sie jedoch mehr Argumente angeben, als Positionsparameter definiert sind, wird der Fehler angezeigt.

Get-Item C:\temp\thing.txt "*"

Da dieses Cmdlet nicht weiß, wie der zweite Positionsparameter akzeptiert wird, wird der Fehler angezeigt. Sie können dies beheben, indem Sie ihm sagen, was der Parameter sein soll.

Get-Item C:\temp\thing.txt -Filter "*"

Ich nehme an, Sie erhalten den Fehler in der folgenden Codezeile, da es anscheinend der einzige Ort ist, an dem Sie die Parameternamen nicht korrekt angeben, und möglicherweise = als Parameter und $ username als weiteren Parameter behandelt.

Set-ADUser $user -userPrincipalName = $newname

Geben Sie den Parameternamen für $ user an und entfernen Sie das =

9
Alexis Coles

Ich hatte dieses Problem, nachdem ich meine Write-Host-Cmdlets in Write-Information konvertiert hatte, und es fehlten Anführungszeichen und Parens um die Parameter. Die Cmdlet-Signaturen sind offensichtlich nicht gleich. 

Write-Host this is a good idea $here 
Write-Information this is a good idea $here <= SCHLECHT

Dies ist die Cmdlet-Signatur, die korrigiert wurde, nachdem der Funktionsstapel nach 20 bis 30 Minuten abgebrochen wurde.

Write-Information ("this is a good idea $here") <= GUT

4

In meinem Fall war es der Unterschied zwischen und - wie in:

Add-Type –Path "C:\Program Files\Common Files\Microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"

und:

Add-Type -Path "C:\Program Files\Common Files\Microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
0
Nae

In meinem Fall hatte ich versucht, den Code lesbarer zu machen, indem ich Folgendes schrieb:

"LONGTEXTSTRING " +
"LONGTEXTSTRING" +
"LONGTEXTSTRING"

Einmal habe ich es geändert

LONGTEXTSTRING LONGTEXTSTRING LONGTEXTSTRING 

Dann hat es geklappt

0
Frostiness

Ich musste verwenden

powershell.AddCommand("Get-ADPermission");
powershell.AddParameter("Identity", "complete id path with OU in it");

um diesen Fehler zu überwinden

0
Bbb

In meinem Fall befand sich in einem der genannten Parameter ein beschädigtes Zeichen ("-StorageAccountName" für das Cmdlet "Get-AzureStorageKey"), das in meinem Editor (SublimeText) als völlig normal angezeigt wurde, aber Windows Powershell konnte es nicht analysieren. 

Um es ganz auf den Grund zu bringen, habe ich die fehlerhaften Zeilen aus der Fehlermeldung in eine andere .ps1-Datei verschoben, ausgeführt und der Fehler zeigte jetzt ein verpatztes Zeichen am Anfang meines Parameters "-StorageAccountName".

Wenn Sie das Zeichen löschen (was im eigentlichen Editor wieder normal aussieht) und es erneut eingeben, wird dieses Problem behoben.

0
starmandeluxe