powershell 脚本到 select 目录

powershell script to select directory

我想创建一个 powershell 函数或 cmdlet,使我能够快速导航到文件和函数,如下例所示。有人可以告诉我“/D”的名称吗?是参数吗?

C:\Windows\system32> folder /help
Usage: Select directory folder [/? | /Username | /S | /D] 

No args    Display help. This is the same as typing /?.
/?         Display help. This is the same as not typing any options.
/Username  Change to the "Username" directory
/S         Change to the "scripts" directory
/D         Change to the "desktop" directory

C:\Windows\system32> folder /username
C:\Users\username> folder /S
C:\Users\username\desktop\scripts> folder /D
C:\Users\username\desktop>

这就是我目前所拥有的。这只会将我带到桌面目录,我将如何编写以将其命名为“文件夹”并添加 modifier/parameters?

function desktop { cd "C:\users\username\desktop" }

其功能如下:

C:\Windows\system32> desktop
C:\Users\username\desktop>

是的,在 PowerShell 术语中 /D 称为 参数 (其他 shell 可能将其称为 选项 flag,如 Abraham Zinala 注释),但请注意 PowerShell 只接受 - 作为 parameter-name 印记,因此它必须是 -D(在调用时您可以自由使用 -d-D,因为参数名称在 PowerShell 中不是 case-sensitive)。
充当 on/off 开关的参数(在其他 shell 中称为 标志 ,即不采用 参数 的参数) ,在 PowerShell 中称为 开关 [参数]

请注意,虽然您 可以 在 PowerShell 中定义 single-letter 参数名称,但习惯上使用更长的描述性名称,例如-Desktop:

  • 感谢 PowerShell 调用的 弹性语法 ,您仍然可以在调用时仅使用 -d,只要 d 明确地表示完整的目标参数名称(例如,-Desktop)。

  • 或者,您可以显式声明 -d-Desktop 的别名,方法是使用 [Alias()] 属性修饰参数声明。

这是一个示例函数,它的工作方式与您指定的略有不同,但以更 PowerShell-idiomatic 的方式运行:

  • Parameter-less 调用更改为当前用户的主文件夹。

    • 要定位不同用户的主文件夹,请将用户名传递给 -u / -UserName 参数。
  • 在给定调用中选择的任何用户主文件夹都可以选择 -Desktop / -d 或 [=] 组合 28=] / -s,以便更改为目标用户的桌面/脚本文件夹。

  • 要显示帮助,请使用 PowerShell 默认支持的 -?(或 Get-Help folder),显示命令的语法。

    • 要向帮助添加口头描述,您可以使用 comment-based 帮助功能 - 请参阅概念性 about_Comment_Based_Help 帮助主题。
  • Push-Location rather than Set-Location (whose built-in alias is cd) is used to change location, to enable returning to the previous folder with Pop-Location(其 built-in 别名是 popdpopl

  • 下面的函数是一个so-called高级函数,这意味着它的行为类似于(二进制)cmdlet;有关详细信息,请参阅概念性 about_Functions_Advanced and about_Functions_Advanced_parameters 帮助主题。

function folder {
  [CmdletBinding(DefaultParameterSetName='Default')]
  param(    
    [Alias('u')]
    [string] $Username
    ,
    [Alias('s')]
    [Parameter(ParameterSetName='Scripts')]
    [switch] $Scripts
    ,
    [Parameter(ParameterSetName='Desktop')]
    [Alias('d')]
    [switch] $Desktop
  )

  $targetFolder = 
    if ($Username) { 
      Join-Path (Split-Path -LiteralPath $HOME) $Username
    } else {
      $HOME
    }

  if ($Scripts) {
    $targetFolder += '\Desktop\Scripts'
  } elseif ($Desktop) {
    $targetFolder += '\Desktop'
  }

  Push-Location -LiteralPath $targetFolder
}

调用示例:

folder             # change to current user's home folder

folder -d          # change to current user's desktop folder

folder -u jdoe -s  # change to jdoe's scripts folder

folder -?          # show help

终于修好了!

我需要一个标志或一个跟踪变量,本质上是在第一个 if 语句之前定义 $targetFolder。我想知道它是否试图将目标文件夹定义为整个 if 语句。有关多个 if 语句的信息,请参阅 windows 文档 here

function  display-path {Get-ChildItem Env:Path }

    <# 
    **One of these can be used to navigate to the username directory. The first will only allow you to navigate to one user, the second allows for you to select the user.**
    $targetFolder = 
      if ($Username) { 
        $targetFolder += '\user\Username' #replace with your username
      } 
       
    if ($Username) { 
      Join-Path (Split-Path -LiteralPath $HOME) $Username
    } else {
      $HOME
    } #>
    function folder {
        [CmdletBinding(DefaultParameterSetName='Default')]
        param(    
          [Alias('u')]
          [switch] $Username
          ,
          [Alias('s')]
          [Parameter(ParameterSetName='Scripts')]
          [switch] $Scripts
          ,
          [Parameter(ParameterSetName='Desktop')]
          [Alias('d')]
          [switch] $Desktop
          ,
          [Alias('h')]
          [Parameter(ParameterSetName = 'help')]
          [switch]$Help
          ,
          [Alias('r')]
          [Parameter(ParameterSetName = 'root')]
          [switch]$root
        )
      
        $targetFolder =  $env:USERPROFILE
        if ($Username) { 
            $targetFolder = $env:USERPROFILE
            $u = ' -U'
          }
          elseif ($Scripts) {
          $targetFolder += '\Desktop\Scripts'
        }
          elseif ($Desktop) {
          $targetFolder += '\Desktop'
        }
          elseif ($root) {
  
            ## same as other but we can use $env:homedrive for the root of C:
        
            $targetFolder = $env:HOMEDRIVE + '\'
            $r = ' -R '
        
          }
        elseif ($Help) {
        echo "
        -H         Display help. This is the same as not typing any options.
        -U         Change to the 'Username' directory
        -S         Change to the 'scripts' directory
        -D         Change to the 'desktop' directory"
    }
        else {
        echo "
        -H         Display help. This is the same as not typing any options.
        -U         Change to the 'Username' directory
        -S         Change to the 'scripts' directory
        -D         Change to the 'desktop' directory"
    }
      
        Push-Location -LiteralPath $targetFolder
      }

请随意将其用于您自己的导航,感谢您的帮助! 这是代码的 github link:https://github.com/semiexperienced/Windows-Powershell-Alias-and-Navigation