web-dev-qa-db-fra.com

Powershell: impossible de trouver un paramètre de position acceptant l'argument "xxx"

J'essaie de comprendre ce que cette erreur signifie réellement. Jusqu'à présent, une recherche de demandes d'aide similaires pour cette erreur allait des paramètres manquants aux canaux manquants, en passant par l'utilisation de lignes simples ou multiples, ainsi que des problèmes de concaténation, mais aucune des réponses ne semble donner de raison définitive. Donc, je suppose que le problème concerne le format du code (ce qui rend la recherche beaucoup plus difficile).

C’est mon script que j’écris pour renommer les utilisateurs d’Active Directory par unité cible, quel que soit leur format, en un format prénom.nom.

J'ai créé une unité d'organisation de test dans AD avec certains utilisateurs, ce qui déclenche des erreurs et d'autres non. Cependant les utilisateurs qui ne devraient pas me donner une erreur me donnent le "un paramètre de position qui accepte l'argument ne peut pas être trouvé" firstname.surname " 

Je ne peux pas voir ce qui ne va pas dans le script, mais j'espère que quelqu'un pourra me donner des indications.

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

Les applets de commande de PowerShell acceptent de nombreux arguments. Lorsque ces arguments sont définis, vous pouvez définir une position pour chacun d’eux.

Cela vous permet d'appeler une cmdlet sans spécifier le nom du paramètre. Ainsi, pour la cmdlet suivante, l’attribut path est défini avec une position égale à 0, ce qui vous permet d’éviter de taper -Path lorsqu’il est appelé. Ainsi, les deux éléments suivants fonctionneront.

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

Cependant, si vous spécifiez plus d'arguments que de paramètres de position définis, vous obtiendrez l'erreur.

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

Comme cette applet de commande ne sait pas comment accepter le deuxième paramètre de position, vous obtenez l'erreur. Vous pouvez résoudre ce problème en lui disant ce que le paramètre est censé être.

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

J'imagine que vous obtenez l'erreur sur la ligne de code suivante, car il semble que ce soit le seul endroit où vous ne spécifiez pas correctement les noms de paramètres. Peut-être traite-t-on le = en tant que paramètre et le nom d'utilisateur $ comme autre paramètre.

Set-ADUser $user -userPrincipalName = $newname

Essayez de spécifier le nom du paramètre pour $ user et de supprimer le =

9
Alexis Coles

J'ai eu ce problème après avoir converti mes cmdlets Write-Host en Write-Information et il me manquait des guillemets et des parens autour des paramètres. Les signatures d'applet de commande ne sont évidemment pas les mêmes. 

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

C'est la signature de l'applet de commande qui a été corrigée après 20 à 30 minutes de fouille dans la pile de fonctions ...

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

4
SliverNinja - MSFT

Dans mon cas, la différence entre et - était la suivante:

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

et:

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

Dans mon cas, l'un des paramètres nommés ("-StorageAccountName" de la cmdlet "Get-AzureStorageKey") était corrompu et apparaissait parfaitement normal dans mon éditeur (SublimeText), mais Windows Powershell ne pouvait pas l'analyser. 

Pour aller au fond des choses, j'ai déplacé les lignes incriminées du message d'erreur dans un autre fichier .ps1, puis je l'ai exécuté. L'erreur indiquait maintenant un caractère masqué au début de mon paramètre "-StorageAccountName".

Supprimer le caractère (encore une fois, ce qui semble normal dans l'éditeur) et le retaper pour résoudre le problème.

0
starmandeluxe