Вариант 1:
>PS C:\Users\user> & "C:\Program Files\Windows NT\Accessories\wordpad.exe"
Символ "&" перед полным строковым именем исполняемого файла указывает на то, что сделующую за ним строку следует трактовать как команду. Двойные или одинарные (смотря по обстоятельствам) кавычки необходимы, т.к. в пути содержатся пробелы. Для тех кто не в курсе, поясняю: если использовать двойные кавычки, то все имена переменных (определённых в PowerShell, а так же созданных нами), указанных в тексте, будут заменены их значениями. Если использовать одинарные кавычки - замена производиться не будет. Пример:
PS D:\> "Домашний каталог пользователя: $Home" Домашний каталог пользователя: C:\Users\user
В строке переменная была заменена своим значением.
PS D:\> 'Домашний каталог пользователя: $Home' Домашний каталог пользователя: $Home
Строка осталась без изменений.
Вариант 2:
PS C:\Users\user> cd "C:\Program Files\Windows NT\Accessories" PS C:\Program Files\Windows NT\Accessories> .\wordpad
Наличие ".\" перед файлом необходимо (данное требование присутствует в PowerShell из соображений безопасности), а расширение файла можно не указывать.
Если развернуть свойство ярлыка, указывающего на файл wordpad.exe, то можно увидеть, что в пути используется системная переменная %ProgramFiles%. Однако, если мы просмотрим перечень переменных, доступных на диске "variable:", то увидим что переменной с таким именем там нет.
PS D:\> ls variable:
Name Value
---- -----
$ Домашний каталог пользователя: $Home
? True
^ Домашний каталог пользователя: $Home
_
a C:\Program Files\Windows NT\Accessories\wordpad.exe
args {}
ConfirmPreference High
ConsoleFileName
DebugPreference SilentlyContinue
Error {Не удается найти путь "C:\Users\user\variable", так как он не существует., Имя "vari...
ErrorActionPreference Continue
ErrorView NormalView
ExecutionContext System.Management.Automation.EngineIntrinsics
false False
FormatEnumerationLimit 4
HOME C:\Users\user
Host System.Management.Automation.Internal.Host.InternalHost
input System.Collections.ArrayList+ArrayListEnumeratorSimple
LASTEXITCODE 1
MaximumAliasCount 4096
MaximumDriveCount 4096
MaximumErrorCount 256
MaximumFunctionCount 4096
MaximumHistoryCount 64
MaximumVariableCount 4096
MyInvocation System.Management.Automation.InvocationInfo
NestedPromptLevel 0
null
OutputEncoding System.Text.ASCIIEncoding
PID 5840
PROFILE C:\Users\user\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
ProgressPreference Continue
PSBoundParameters {}
PSCulture ru-RU
PSEmailServer
PSHOME C:\Windows\System32\WindowsPowerShell\v1.0
PSSessionApplicationName wsman
PSSessionConfigurationName <a href="http://schemas.microsoft.com/powershell/Microsoft.PowerShell
PSSessionOption">http://schemas.microsoft.com/powershell/Microsoft.PowerShell
PSSessionOption</a> System.Management.Automation.Remoting.PSSessionOption
PSUICulture ru-RU
PSVersionTable {CLRVersion, BuildVersion, PSVersion, WSManStackVersion...}
PWD D:\
ReportErrorShowExceptionClass 0
ReportErrorShowInnerException 0
ReportErrorShowSource 1
ReportErrorShowStackTrace 0
ShellId Microsoft.PowerShell
StackTrace в System.Management.Automation.CommandDiscovery.LookupCommandInfo(String commandNa...
true True
VerbosePreference SilentlyContinue
WarningPreference Continue
WhatIfPreference False
Соответственно нам не удастся в пути к файлу использовать переменную $ProgramFiles (т.к. её нет в приведённом выше списке). В подобных ситуациях следует использовать синтаксис $env:ИмяПеременной, тем самым указывая PowerShell, что речь идёт о переменной операционной системы:
Вариант 3:
PS C:\Users\user> & "$env:ProgramFiles\Windows NT\Accessories\wordpad.exe"
В принципе, можно воспользоваться и средствами .NET (на любителя):
Вариант 4:
>PS C:\Users\user> & $([System.Environment]::ExpandEnvironmentVariables("%ProgramFiles%\Windows NT\Accessories\wordpad.exe"))
Наличие в данном выражении блока "$(...)" необходимо, т.к. этот синтаксис сообщает PowerShell о том, что сначала следует вычислить выражение, находящееся внутри этого оператора и уже затем результат передать далее (в нашем случае - "&").

Комментариев нет:
Отправить комментарий