Изначально я хотел в интерактивном режиме:

  1. Найдите каталог исполняемого файла (в ограниченном случае с помощью where)
  2. Запустите родительский каталог исполняемого файла в Проводнике.

Я попробовал следующее в Windows cmd:

  • Можно прочитать стандартный вывод из команды cmd where

    where pip 1> myfile.txt
    
  • Однако то, что я действительно хотел, было что-то вроде

    where pip | cd.. | explorer
    
  • where pip возвращает строку с путем к исполняемому файлу, если она находится в %PATH% системной среды. Однако я не смог выяснить, как добраться до родительского каталога на основе строки, возвращаемой where .


Решение, которое я нашел в Power Shell, было таким:

$a = Get-Item((gcm pip.exe).Path); Split-Path -Path $a -Parent | ii

Есть ли более компактное решение этой проблемы?

1 ответ1

1

Это …

$a = Get-Item((gcm pip.exe).Path); Split-Path -Path $a -Parent | ii

.. буквально две независимые команды. Наличие их на одной линии действительно делает это однострочным, что, похоже, является вашим вариантом использования.

Вы можете посмотреть, что конкретно вы можете использовать, используя командлет Get-Member.

Get-Item((gcm notepad.exe).Path) | Get-Member


   TypeName: System.IO.FileInfo

Name                      MemberType     Definition                                                                                                               
----                      ----------     ----------                                                                                                               
...                                         
PSChildName               NoteProperty   string PSChildName=notepad.exe                                                                                           
PSDrive                   NoteProperty   PSDriveInfo PSDrive=C                                                                                                    
PSIsContainer             NoteProperty   bool PSIsContainer=False                                                                                                 
PSParentPath              NoteProperty   string PSParentPath=Microsoft.PowerShell.Core\FileSystem::C:\Windows\system32                                            
PSPath                    NoteProperty   string PSPath=Microsoft.PowerShell.Core\FileSystem::C:\Windows\system32\notepad.exe                                      
..                                                                                     
Directory                 Property       System.IO.DirectoryInfo Directory {get;}                                                                                 
DirectoryName             Property       string DirectoryName {get;}                                                                                              
...                                                                                               
FullName                  Property       string FullName {get;}                                                                                                   
...

Что, конечно, доставит вас сюда:

(Get-Item((gcm notepad.exe).Path)).Directory
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       12/19/2018   1:33 PM                system32

(Get-Item((gcm notepad.exe).Path)).DirectoryName
C:\Windows\system32

(Get-Item((gcm notepad.exe).Path)).FullName
C:\Windows\system32\notepad.exe

Таким образом ...

ii (gi((gcm notepad.exe).Path)).FullName 

Следует отметить, что это все круто и все для интерактивных вещей, но лучше избегать лучших практик в производственных скриптах, псевдонимах и коротких именах, так как это усложняет понимание и поддержку скрипта.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .