Можно ли в PowerShell создать псевдоним, имя которого содержит пробел? - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу сделать rm -rf псевдонимом для Remove-Item, поскольку я постоянно набираю его при использовании PowerShell.

Я догадался, может быть, я мог бы сделать что-то подобное, но это не работает.

Set-Alias -name 'rm -rf' -value Remove-Item

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Вы также можете удалить псевдоним по умолчанию и затем заменить его пользовательской функцией.

# remove default alias
if (Test-Path Alias:rm) {Remove-Item Alias:rm}

# custom function for 'rm'
function rm {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $false)]
        [switch]$rf,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]$Path
    )
    Process {
        Remove-Item -Path $Path -Recurse:$rf -Force:$rf
    }
}

Тогда назовите это так:

rm -rf "C:\Temp\dir"

Если, конечно, пока эта функция не обладает полной функциональностью Remove-Item, но вы можете расширить ее, как вам нравится.

Примечание: Даже если это «решит» вашу проблему в краткосрочной перспективе, вам не следует возвращаться к этим видам обходных путей. Лучше привыкнуть к действующим командам и синтаксису PowerShell, иначе рано или поздно вы столкнетесь с большим количеством проблем.

0 голосов
/ 05 ноября 2018

У вас уже есть решение вашей проблемы, но, как я уже говорил, прокси-функция может подойти в этом конкретном сценарии. Вот рабочий пример (по крайней мере, для PSVersion 5.1).

Добавление следующего в ваш профиль $ должно работать, и вы сможете запустить rm -rf "path" для рекурсивного и принудительного удаления каталога. Имейте в виду, что это не было тщательно протестировано, но оно учитывает, указали ли вы -rf или нет в командной строке. Он также поддерживает общие параметры, такие как -Confirm:$true.

if(Test-Path Alias:rm) { Remove-Item Alias:rm }

function rm
{
    [CmdletBinding(DefaultParameterSetName='Path', SupportsShouldProcess=$true, ConfirmImpact='Medium', SupportsTransactions=$true, HelpUri='https://go.microsoft.com/fwlink/?LinkID=113373')]
    param(
        [Parameter(ParameterSetName='Path', Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
        [string[]]
        ${Path},

        [Parameter(ParameterSetName='LiteralPath', Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
        [Alias('PSPath')]
        [string[]]
        ${LiteralPath},

        [string]
        ${Filter},

        [string[]]
        ${Include},

        [string[]]
        ${Exclude},

        [switch]
        ${Recurse},

        [switch]
        ${Force},

        [switch]
        ${rf},

        [Parameter(ValueFromPipelineByPropertyName=$true)]
        [pscredential]
        [System.Management.Automation.CredentialAttribute()]
        ${Credential})


    begin
    {
        try {
            $outBuffer = $null
            if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
            {
                $PSBoundParameters['OutBuffer'] = 1
            }

            if($rf)
            {
                $PSBoundParameters.Remove('rf') | Out-Null
                $PSBoundParameters.Add('Recurse', $true) | Out-Null
                $PSBoundParameters.Add('Force', $true) | Out-Null
            }

            $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Management\Remove-Item', [System.Management.Automation.CommandTypes]::Cmdlet)
            $scriptCmd = {& $wrappedCmd @PSBoundParameters }
            $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
            $steppablePipeline.Begin($PSCmdlet)
        } catch {
            throw
        }
    }

    process
    {
        try {
            $steppablePipeline.Process($_)
        } catch {
            throw
        }
    }

    end
    {
        try {
            $steppablePipeline.End()
        } catch {
            throw
        }
    }
    <#

    .ForwardHelpTargetName Microsoft.PowerShell.Management\Remove-Item
    .ForwardHelpCategory Cmdlet

    #>
}
0 голосов
/ 01 ноября 2018

Это будет работать. Установите псевдоним, как показано ниже.

Set-Alias -Name 'rm -rf' -Value Remove-Item

Для его вызова вы можете использовать оператор вызова (&), например, -

& 'rm -rf' \\PathToYourFileWhichYouWantToDelete\FileName.extension
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...