Vamos responder à pergunta imediata: por que seu primeiro exemplo funciona, mas seu segundo exemplo não? Vamos começar com porque o primeiro trabalho. Envolve os diferentes Modos de análise do PowerShell.
Seu primeiro exemplo (trabalhos):
Get-DhcpServerv4Scope -scopeid 10.1.0.0,10.1.1.0
No seu primeiro exemplo, o PowerShell está no modo de análise de comandos porque sua linha começa com um comando. No Modo de Comando, o PowerShell irá citar automaticamente argumentos para um comando para você, já que citar tudo o tempo todo quando estiver trabalhando em seu shell seria realmente irritante! Isso significa que está citando os valores do seu endereço IP não-qualificado para você, transformando-os em strings e o ',' (operador Comma) está combinando as duas strings em uma matriz. Como o parâmetro é IPAddress [] (array do objeto IPAddress), ele tenta converter suas strings para IPAddress e é bem-sucedido, já que elas são entradas individuais em uma matriz e IPAddress sabe como analisar 1 string nesse formato e cria um endereço IP objeto com ele. Pelo menos, tenho 90% de certeza de que uma combinação dessas três coisas (operador de vírgula / matriz, modo de análise de comandos e transmissão) é o motivo pelo qual isso funciona.
NOTA: Mais especificamente, o modo de comando pode ser chamado de modo de argumento (como em argumentos para um comando), o outro modo sendo chamado de modo de expressão. No meu antigo livro do PowerShell, acabei de vê-lo chamado modo de comando, mas o documento atual fala sobre o modo de argumento.
Do documento:
In argument mode, each value is treated as an expandable string unless it begins with one of the following special characters: dollar sign ($), at sign (@), single quotation mark ('), double quotation mark ("), or an opening parenthesis (().
Seu segundo exemplo:
$IP = "10.2.0.0,10.1.0.0"
Get-DhcpServerv4Scope -scopeid $IP
Na primeira linha, você está apenas criando uma string, "10.2.0.0,10.1.0.0"
. O PowerShell permitirá que você crie a string como quiser e a deixe sozinha. Mesmo se você omitiu as aspas duplas, perceberá que o PowerShell não fará a mesma coisa que o Exemplo 1 ... e isso é porque ele está no Modo de Expressão e não irá citar automaticamente o seu strings para você neste modo. Quando tento não recebo nada atribuído. Você provavelmente viu isso também.
Na segunda linha do seu exemplo, não há nada de especial que o PowerShell faça - é apenas uma string que tem uma vírgula - não vai inspecionar e modificar sua string, ela apenas passará adiante , onde ele não conseguirá analisar em um IPAddress porque não é o formulário válido e o método de análise que IPAddress só pode manipular um único endereço IP e não uma seqüência separada por vírgulas deles.
Esta parte pode ser corrigida ajustando a linha como Pedro sugeriu em uma matriz. por exemplo:
$IP = @("10.2.0.0","10.1.0.0")
Pode então ser passado diretamente:
Get-DhcpServerv4Scope -ScopeId $IP
No entanto, você não especificou se pretende processar apenas alguns escopos. Eu não vejo um comentário sobre você editando seu CSV para excluir certos escopos (ou em seu código), então você poderia pular TODOS estes neste caso e apenas chamar Get-DhcpServerv4Scope sem qualquer argumento -ScopeId e ele retornará todos escopos . Você pode pular tudo isso para o CSV e voltar ao trabalho.
Não está claro para mim a razão para a reconstrução do escopo, já que parece que você está potencialmente descartando concessões existentes de 8 dias (se elas tiverem o mesmo que era antes, talvez tenham sido configuradas como muito curtas primeiro) e Pode haver conflitos de endereço se o servidor o realocar antes que os clientes com essas concessões expirem. Talvez eu esteja perdendo alguma coisa. Apenas tome cuidado, seja qual for o seu objetivo final, e boa sorte!