2016-02-16 24 views
8

Sto cercando di capire cosa significa in realtà questo errore. Finora una ricerca di richieste di aiuto simili per questo errore va da parametri mancanti, pipe mancanti, uso di linee singole o multi e anche problemi di concatenazione, ma nessuna delle risposte sembra dare una ragione definitiva. Quindi presumo che il problema sia il formato del codice (il che rende molto più difficile rintracciare).PowerShell: impossibile trovare un parametro posizionale che accetti la discussione "xxx"

Questo è il mio script che sto scrivendo per rinominare gli utenti di directory attive per OU di destinazione da qualunque formato siano ora in un formato nome.cognome.

Ho creato un OU di test in AD con alcuni utenti che causeranno errori e altri no. Tuttavia gli utenti che non dovrebbero darmi un errore mi stanno dando "un parametro posizionale non può essere trovato che accetta argomentazione" nome.cognome "

Non riesco a vedere cosa c'è di sbagliato con lo script ma spero che qualcuno possa darmi alcuni suggerimenti .

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 
    } 
} 

}

+2

Dove l'errore si verifica potrebbe essere utile invece di farci indovinare. Cursory glance dice che questo è sbagliato 'Set-ADUser $ user -userPrincipalName = $ newname'. Rimuovi il segno di uguale a – Matt

risposta

6

cmdlet di PowerShell accettano un mucchio di argomenti. Quando questi argomenti sono definiti è possibile definire una posizione per ciascuno di essi.

Questo consente di chiamare un cmdlet senza specif ying il nome del parametro. Quindi per il seguente cmdlet l'attributo path è definito con una posizione di 0 che consente di saltare digitando -Path quando lo si richiama e come tale funzionerà entrambi i seguenti.

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

Tuttavia se si specificano più argomenti di quanti sono i parametri posizionali definiti, si otterrà l'errore.

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

Poiché questo cmdlet non sa come accettare il secondo parametro posizionale si ottiene l'errore. Puoi risolvere questo problema dicendogli quale deve essere il parametro.

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

Presumo che stanno ottenendo l'errore sulla seguente riga di codice come sembra essere l'unico posto dove non si specifica correttamente i nomi dei parametri, e forse sta trattando i = come parametro e $ username come un altro parametro.

Set-ADUser $user -userPrincipalName = $newname 

Prova a specificare il nome del parametro per $ utente e rimuovendo i =

+0

Grazie per la spiegazione di Alexis che ha più senso. –

2

ho avuto questo problema dopo la conversione miei Write-Host cmdlet per Write-Information e mi mancava citazioni e parentesi intorno ai parametri. Le firme cmdlet non sono evidentemente identiche.

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

Questa è la firma cmdlet che corretto dopo aver trascorso 20-30 minuti di scavo lungo la pila funzione di ...

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

+1

Questo è stato molto utile. Ho continuato a ricevere questo errore, ma non sapevo da dove veniva gettato. Grazie! – dstepan

0

Nel mio caso c'era un personaggio corrotto in una delle params nome ("-StorageAccountName" per cmdlet "Get-AzureStorageKey") che ha mostrato come perfettamente normale nel mio editor (SublimeText) ma Windows PowerShell non è stato in grado di analizzarlo.

Per raggiungere la fine, ho spostato le righe incriminate dal messaggio di errore in un altro file .ps1, l'ho eseguito e l'errore ora mostrava un carattere mal riuscito all'inizio del mio parametro "-StorageAccountName".

Eliminando il carattere (che appare normale nell'editor attuale) e riscrivendolo, si risolve questo problema.

Problemi correlati