Вероятно, есть несколько десятков приложений, которые я использую ежедневно. Это приложения, которые не «установлены», но находятся где-то в файловой системе. Запуск любого из них предполагает что-то вроде этого:

e:
cd \PortableApps\FileZillaPortable
FileZillaPortable.exe

(Нет, не все из них являются «переносными приложениями», поэтому использование средства запуска переносимых приложений не решает проблему). Я, однако, склоняюсь к тому, чтобы засунуть их в папку PortableApps.) Я хотел бы сделать более быстрый способ получить к ним доступ. Я мог бы положить кучу командных файлов где-то в пути, но .. Какой беспорядок!

Поскольку я постоянно использую окно powershell, я подумал, что было бы неплохо иметь ярлык для запуска моих приложений.

Как я могу сделать один хороший ярлык, который работает для всех таких приложений?

2 ответа2

1

Я добавил следующий скрипт в свой профиль. Теперь все, что мне нужно сделать в командной строке powershell, это набрать p (space) (ctrl-space) и начать вводить имя приложения. Или я могу набрать p -AppName . (после нажатия клавиши пробела появляется значок «завершить») Обратите внимание, что вам не нужно вводить полное имя; скрипт p откроет первое приложение, имя которого соответствует вашему значению.

Пример завершителя

(Кстати, я использовал LICECap, чтобы сделать анимированный GIF.)

Это мой первый проход в этом. Любые предложения по улучшению будут оценены.

Для вашего использования вам просто нужно добавить ваши пути в массив подходов.

$Global:approots = @(
"E:\PortableApps",
($env:USERPROFILE+"\Downloads")
)
if (-not (Test-Path ($PSScriptRoot+"\AppShortcuts.txt"))) {
    $approots | %{
        $approot = $_
        dir -Recurse ($approot+"\*.exe") | 
        %{ $_.Name.Remove($_.Name.LastIndexOf(".")) + "`t" + $_.FullName } 
    } |
    sort | Out-File -FilePath ($PSScriptRoot+"\AppShortcuts.txt")
}    
function global:p {
    <#
    .SYNOPSIS 
    Launch a portable app.
    .DESCRIPTION
    Launches a portable app whose name starts with the supplied parameter.
    .EXAMPLE
    p filezil
    .PARAMETER PartialFileName
    The beginning of the name of a portable app's EXE file
    #>    
    [CmdletBinding()]
    Param($AppName="start.exe")

    process {
        if (-not (Test-Path ($PSScriptRoot+"\AppShortcuts.txt"))) {
            $approots | %{
                $approot = $_
                dir -Recurse ($approot+"\*.exe") | 
                %{ $_.Name.Remove($_.Name.LastIndexOf(".")) + "`t" + $_.FullName } 
            } |
            sort | Out-File -FilePath ($PSScriptRoot+"\AppShortcuts.txt")
        }    
        gc ($PSScriptRoot+"\AppShortcuts.txt") | ?{ $_.Substring(0,$_.IndexOf("`t")).StartsWith($AppName) }|
        select -first 1 | %{ start ($_.SubString($_.IndexOf("`t")+1)) }
    }
}
Register-ArgumentCompleter -CommandName 'p' -ParameterName 'AppName' -ScriptBlock {
    # learned this from icklicksick on https://www.reddit.com/r/PowerShell/comments/5nqw4m/adding_tabcompletion_to_your_powershell_functions/
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
    gc ($PSScriptRoot+"\AppShortcuts.txt") | %{$val=$_.Substring(0,$_.IndexOf("`t"));[System.Management.Automation.CompletionResult]::new($val, $val, 'ParameterValue', $val)}
}

Суть этого кода заключается в создании текстового файла, который содержит список имен приложений и их полные пути. (с разделителями табуляции) Затем функция p позволяет искать приложения, имя которых начинается с параметра AppName . Затем мы используем Register-ArgumentCompleter чтобы добавить все имена приложений в список возможных значений для AppName .

0

Вернувшись в DOS 3.2 дня, я создал пакетные файлы для создания ярлыков. У меня была целая папка из них, и затем я поместил эту папку в переменную PATH, чтобы я мог запускать их, как команды, из любого места.

В LINUX люди часто сбрасывают все свои двоичные файлы в папку /usr/bin и помещают их в переменную PATH. Эквивалент в Windows будет использовать что-то вроде:

% USERPROFILE%\ Bin \

Поместите это в свой ПУТЬ. Тогда выкинь туда все свои файлы. (Я знаю, это звучит грязно, но это было бы очень легко)

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