Есть ли функциональная разница между -OutVariable и назначением переменной? - PullRequest
1 голос
/ 01 июня 2019

Я столкнулся со следующим странным поведением, и я надеялся, что кто-то может указать мне какую-то документацию, которая может объяснить, почему это поведение происходит или что его вызывает.

Я попытался просмотреть документацию для New-SelfSignedCertificate, чтобы увидеть, было ли замечание, объясняющее это, или параметр, который «заставил» его завершить, но не нашел ничего полезного.https://docs.microsoft.com/en-us/powershell/module/pkiclient/new-selfsignedcertificate?view=win10-ps

Я также пытался выполнить поиск в Google для OutVariable vs назначение, но также не нашел ничего полезного.

Рассмотрим следующие функции:

function Why-DoesThisFail {
    $cert = New-SelfSignedCertificate -Type Custom -Subject "CN=test" -KeyAlgorithm "RSA" -KeyLength 2048 `
        -CertStoreLocation "Cert:\CurrentUser\My" -NotAfter (Get-Date).AddDays(1) -KeySpec Signature `
        -KeyExportPolicy NonExportable;

    # Note that this outputs fine.
    Write-Host $cert.Thumbprint;

    # Prints nothing
    Get-ChildItem -Path "Cert:\CurrentUser\My\$cert.Thumbprint";
}

function Why-DoesThisPass {
    New-SelfSignedCertificate -Type Custom -Subject "CN=test" -KeyAlgorithm "RSA" -KeyLength 2048 `
        -CertStoreLocation "Cert:\CurrentUser\My" -NotAfter (Get-Date).AddDays(1) -KeySpec Signature `
        -KeyExportPolicy NonExportable -OutVariable cert;

    # Note that this outputs fine.
    Write-Host $cert.Thumbprint;

    # Prints Cert as expected
    Get-ChildItem -Path "Cert:\CurrentUser\My\$cert.Thumbprint";
}

Обратите внимание, чтоЕдинственное различие между двумя функциями состоит в том, что одна использует присвоение переменной, а другая - OutVariable.Это поведение самого Powershell в том, как он обрабатывает OutVariable или присваивание;или это из-за того, что New-SelfSignedCertificate делает под прикрытием?Такое ощущение, что сертификат не регистрируется на компьютере до тех пор, пока не завершится New-SelfSignedCertificate, и по какой-то причине он не завершается, когда используется присвоение переменной.Обратите внимание, что после завершения функции и возврата управления в Powershell вы можете успешно запустить последнюю строку (заменив отпечаток пальца записанным с Write-Host) и получить сертификат с машины.

I'mозадачен.

Спасибо за любую помощь!

1 Ответ

3 голосов
/ 01 июня 2019

Ваша проблема не в том, чтобы путать или контекст с этим?

-OutVariable и присвоение переменной?

Это потому, что вы используете строку в первомодин не прав.Двойные кавычки приводят к расширению переменной, но в вашем случае вам нужно изменить интерполяцию строки для этой переменной $ cert с точками.Итак, вы неправильно понимаете расширение строки.

Это ...

Get-ChildItem -Path "Cert:\CurrentUser\My\$cert.Thumbprint";

... должно быть сделано следующим образом.

Get-ChildItem -Path "Cert:\CurrentUser\My\$($cert.Thumbprint)"

..иначе PowerShell не знает, что это такое.Кроме того, эти точки с запятой никогда не нужны в самом PowerShell.Это специальный маркер, разделяющий отдельные сегменты кода.Если у вас все это в одной строке, это не так, но не так, как вы используете это здесь.

Если вы делаете это в ISE или VSCode, вы увидите изменение цветовой кодировки, чтобы отразитькоторый будет расширен, а какой нет.

См. эту статью. Расширение строки Powershell

Переменная интерполяция или два типа строк Строки с одинарными кавычками (') являются литеральными строками, что означает отсутствие специальных символов;каждый символ в строке будет выводиться как сам по себе.Строки с двойными кавычками (") в powershell расширяют переменные и экранирующие символы внутри строки; это называется интерполяцией.

И этот, хотя он и обращается к Here-Strings, он по-прежнему охватываетвот что я пытаюсь здесь сделать.

Расширение переменной в строках и здесь-строках

Теперь что касается вашего поста вопроса ...

Есть ли функциональная разница между -OutVariable и назначением переменной?

... Результат отправки любого из них одинаков. Однако, это сделка ... Вы можете сохранить выводкоманды в переменной и в то же время выводит это на экран. Это то же самое, что делает Out-Variable, тогда как назначение переменной не выводит. Тем не менее, это возможно, если вы используете сжатие переменной. Итак, это ...

Get-ChildItem -OutVariable files

... this ...

($files = Get-ChildItem)

... сделает то же самое. Присвойте результаты переменной и выведите ее на экран одновременно.

Смотрите это --- 3 путиs для хранения и отображения переменной PowerShell одновременно

Использование параметра -OutVariable

Сжатие переменной PowerShell с использованием

Командлет Tee-Object

Наконец, избегайте использования Write-Host, если вы не делаете раскраску текста на экране.PowerShell будет выводить на экран по умолчанию, если вы не укажете обратное.Итак, этот

Write-Host $cert.Thumbprint
Write-Host 'Hello'

... и этот ...

$cert.Thumbprint
'Hello'

... будут делать то же самое.

Если вы должны использовать Write- *,из-за выбранной вами практики кодирования, затем выберите Write-Output.

Обновление для Андрея Одегова точка / указатель

Да, они просто выводят приветна экран.Попытайся.

Write-Host 'hello' 

# results 
hello 

'Hello' 

# results 

Hello

Что касается вашей ссылки ...

Является ли ваше последнее утверждение, что Write-Host "Hello" и "Hello" делают одно и то же, верно?Посмотрите на stackoverflow.com/questions/8755497/…

... все они делают одно и то же.Вывод на экран.

$count = 5 

write-host "count=" + $count

# results 
count= + 5

write-host "count = $count"

# results 
count = 5

"count =  $count"

# results 

count =  5


"count=" + $count

# Results

count=5

Это первое, почему конкатенация строк может иметь проблемы.Я не единственный, кто так думает.См. Это видео.

От авторов большой книги «Собрание PowerShell»

Не объединяйте строки

https://devops -коллектив-inc.gitbook.io/the-big-book-of-powershell-gotchas

https://www.youtube.com/results?search_query=don%27t+concatenate+string

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...