При вставке многострочного скрипта в PowerShell ISE, похоже, выполняется весь блок скрипта сразу.
Вывод из PowerShell ISE
PS C:\> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.18362.145
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.145
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
PS C:\> if ($true) {
Write-Output "yes"
}
else {
Write-Output "no"
}
yes
PS C:\>
При вставке многострочного скрипта в консоль PowerShell он пытается выполнить его построчно?
Вывод из консоли PowerShell
C:\> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.18362.145
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.145
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
C:\> if ($true) {
>> Write-Output "yes"
>> } yes
C:\> else {
>> Write-Output "no"
>> } else : The term 'else' is not recognized as the name of a cmdlet, function, script file, or operable program. Check
the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ else {
+ ~~~~
+ CategoryInfo : ObjectNotFound: (else:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
C:\>
Поведение, которого я ожидаю от PowerShell Console, такое же, как и поведение в PowerShell ISE, он должен знать, что else
это часть оператора if
.
Я не помню, чтобы это когда-либо действовало таким образом. Что заставляет это поведение быть другим?
решение1
Ваш скрипт не работает, потому что else {
находится на другой строке, чем тот, }
что находится над ним. Либо добавьте обратную кавычку, чтобы указать, что он распространяется на следующую строку, либо удалите возврат каретки перед else
:
if ($true) {
Write-Output "yes"
} else {
Write-Output "no"
}