Powershell
Powershell, 7.6.4, $pwshPath
PS D:\> $pwshPath = (Get-Command pwsh).Source
$pwshPath - Место, где лежит
"C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe\pwsh.exe"
Powershell
Powershell, 7.6.4, $pwshPath
PS D:\> $pwshPath = (Get-Command pwsh).Source
$pwshPath - Место, где лежит
"C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe\pwsh.exe"
Pwch, Powershell, Bypass, ExecutionPolicy
PowerShell 7.6.4
-----------------------------------------------------------------------------
D:\Projects\VS02\2606\FlacToMp3\Giga\FlacToMp3_02\Version2\SetExePolicy_01.ps1
--------------------------------------------------------------------------
PS D:\Projects\VS02\2606\FlacToMp3\Giga\FlacToMp3_02\Version2> .\SetExePolicy_01.ps1
Bypass
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Bypass
CurrentUser Undefined
LocalMachine RemoteSigned
--------------------------------------------------------------------
PS C:\Users\Administrator> dotnet --version
10.0.302
PS C:\Users\Administrator> $env:ASPNETCORE_ENVIRONMENT
PS C:\Users\Administrator> Test-Path ".\logs" -PathType Container
False
PS C:\Users\Administrator> Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
PS C:\Users\Administrator> Get-ExecutionPolicy
Bypass
PS C:\Users\Administrator> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Bypass
CurrentUser Undefined
LocalMachine RemoteSigned
PS C:\Users\Administrator> $PSExecutionPolicyPreference
PS C:\Users\Administrator> .\test.ps1
.\test.ps1: The term '.\test.ps1' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
PS C:\Users\Administrator> .\test-bypass_.ps1
.\test-bypass_.ps1: The term '.\test-bypass_.ps1' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
PS C:\Users\Administrator> .\test_bypass_.ps1
Скрипт выполнился! ExecutionPolicy = Bypass
PS C:\Users\Administrator> $PSHOME
C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe
PS C:\Users\Administrator> Test-Path "C:\Program Files\PowerShell\7\pwsh.exe"
False
PS C:\Users\Administrator> Test-Path "C:\Program Files\test_bypass_.ps1"
False
PS C:\Users\Administrator>
Powershell, Where
Ага, теперь всё сходится: у тебя PowerShell установлен через Microsoft Store (на это указывает путь в C:\Program Files\WindowsApps\...). Поэтому стандартный путь C:\Program Files\PowerShell\7\ не срабатывает — отсюда и False от Test-Path.
C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe\pwsh.exe$PSHOME):C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbweWindowsApps — системная и защищена ACL. Обычные пользователи (и многие службы) не имеют туда доступа на чтение/выполнение по умолчанию. Это может стать проблемой, если ты, например, запускаешь скрипт из BackgroundService или CI/CD под ограниченной учёткой.7.6.4.0) и хэш (8wekyb3d8bbwe). При обновлении PowerShell путь изменится — скрипты, которые жёстко прописывают путь, сломаются.PATH может быть настроена так, что pwsh находится, но прямого доступа к папке нет. Команда Get-Command pwsh работает, потому что ищет по PATH, а не по фиксированному пути.pwsh в скриптах и сервисахУчитывая твой контекст (автоматизация, BackgroundService, обработка ошибок и т. д.), лучше не хардкодить путь, а использовать один из этих подходов:
$pwshPath = (Get-Command pwsh).Source
Это сработает, если pwsh добавлен в PATH (в Store‑версии обычно так и есть).
pwsh.exe, а не алиас)$pwshPath = (Get-Command pwsh -CommandType Application).Source
PATH может быть ограничен)Можно искать pwsh.exe в типичных местах и брать первый найденный:
$paths = @(
"C:\Program Files\PowerShell\7\pwsh.exe",
"C:\Program Files (x86)\PowerShell\7\pwsh.exe"
)
$pwshPath = $paths | Where-Object { Test-Path $_ } | Select-Object -First 1
if (-not $pwshPath) {
# fallback: ищем через Get-Command
$pwshPath = (Get-Command pwsh).Source
}
Если ты, например, хочешь вызывать pwsh из C#‑кода (в том числе в рамках твоего Publisher‑Subscriber сервиса или BackgroundService), лучше всего использовать Вариант 1 и передавать путь в ProcessStartInfo.FileName. Так ты не будешь зависеть от конкретной структуры папок и версии.
Если скажешь, в каком именно сценарии тебе нужен путь (например, запуск из C#, скрипт деплоя, проверка версии в CI/CD), подскажу готовый фрагмент кода под эту задачу. 😊
PowerShell, Where ?
-------------------------------------------------
PS C:\Users\Administrator> pwsh
PowerShell 7.6.4
PS C:\Users\Administrator> (Get-Command pwsh).Source
C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe\pwsh.exe
PS C:\Users\Administrator> $PSHOME
C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe
PS C:\Users\Administrator> Test-Path "C:\Program Files\PowerShell\7\pwsh.exe"
False
PS C:\Users\Administrator>
PowerShell, Folder
В Windows Server PowerShell 7+ (pwsh) по умолчанию устанавливается в:
C:\Program Files\PowerShell\7\C:\Program Files (x86)\PowerShell\7\
В этой папке лежит сам исполняемый файл pwsh.exe, а также остальные компоненты. Если скажешь, какая у тебя версия ОС или разрядность — могу подсказать точнее. 😊
FirtstDate, Launch, Start, Begin, DateTime, WinServer
(systeminfo | Select-String "Дата установки ОС|Original Install Date") -replace ".*: ",""
(Get-CimInstance Win32_OperatingSystem).InstallDate
systeminfo | findstr /I "Install"
eventvwr.msc