繁体   English   中英

每次我从文件资源管理器打开终端时如何获取PowerShell当前位置

[英]How can I get PowerShell current location every time I open terminal from file explorer

我可以使用Windows File Explorer在任何目录中打开PowerShell窗口。 我想在每次打开新的PowerShell窗口时运行脚本,并使用在脚本中打开该脚本的当前目录。

使用$profile可以自动执行脚本,但是$pwd变量没有用于打开PowerShell窗口的目录,但是具有C:\\WINDOWS\\system32 我了解PowerShell在C:\\WINDOWS\\system32 ,运行$profile并与File Explorer一起使用下一个更改位置。 当我的脚本从$profile执行时,或者在PowerShell窗口打开后,还有另一种自动执行脚本的方式时,如何获取文件浏览器的当前目录?

注意:以下答案提供了基于Windows PowerShell的预安装文件浏览器快捷菜单命令的解决方案。

如果修改这些命令(需要拥有管理特权来拥有注册表项的所有权)或创建自定义命令是一种选择,则可以从以下注册表项(或其自定义副本)中删除NoWorkingDirectory值:

HKEY_CLASSES_ROOT\Directory\shell\Powershell
HKEY_CLASSES_ROOT\Directory\Background\shell\Powershell

这样做将使原始文件夹成为调用PowerShell 之前的工作目录,以便$PROFILE已经可以看到该工作目录,当您通过文件资源管理器的地址栏提交powershell.exe时也是如此。 [1]


Shadowfax在对该问题的评论中提供了重要的指针:

当按住Shift键,然后在文件资源管理器中的文件夹或窗口背景中调用Open PowerShell window here快捷菜单)命令时, powershell.exe最初以C:\\Windows\\System32作为工作目录[1]启动 ,但随后通过传递作为参数传递的Set-Location命令被指示更改为原始文件夹; 例如,特定的命令可能如下所示:

"PowerShell.exe" -noexit -command Set-Location -literalPath 'C:\Users\jdoe'

顺便说一句:该快捷菜单命令的定义方式存在缺陷 ,因为它不适用于碰巧包含' chars的文件夹路径。

在加载$PROFILEC:\\Windows\\System32仍然有效,因为传递给-command任何命令直到加载配置文件后才被处理。

如果你确实需要知道$PROFILE工作目录什么,一旦会议是开放的,使用以下解决方法:

$workingDir = [Environment]::GetCommandLineArgs()[-1] -replace "'"

[Environment]::GetCommandLineArgs()以参数(令牌)数组的形式返回调用命令行,因此[-1]返回最后一个参数(假定为工作目录路径); -replace "'"从结果中删除封闭的'...'

但是, 为了使$PROFILE文件能够检测(最终)有效的工作目录(位置), 而无论如何调用PowerShell ,都需要进行更多工作。

以下是一个相当健壮的方法,但是请注意,一个完全健壮的解决方案将更加复杂

# See if Set-Location was passed and extract the
# -LiteralPath or (possibly implied) -Path argument.
$workingDir = if ([Environment]::CommandLine -match '\b(set-location|cd|chdir\sl)\s+(-(literalpath|lp|path|PSPath)\s+)?(?<path>(?:\\").+?(?:\\")|"""[^"]+|''[^'']+|[^ ]+)') {
    $Matches.path -replace '^(\\"|"""|'')' -replace '\\"$'
  } else { # No Set-Location command passed, use the current dir.
    $PWD.ProviderPath
  }

解决方案的复杂性来自多种因素:

  • Set-Location具有多个别名。

  • 路径可以通过-Path-LiteralPath或其别名-PSPath进行位置传递。

  • 可以使用不同的引用样式( \\"...\\""""..."""'...' ),也可以不引用路径。

该命令可能仍然失败:

  • 如果启动命令使用参数名称的前缀缩写,例如-lit for -LiteralPath

  • 如果路径以外的命名参数遵循set-location (例如-PassThru )。

  • 如果将字符串set-location嵌入在PowerShell最终解析为字符串文字而不是命令中的内容中。

  • 如果启动命令通过-EncodedCommand作为Base64编码的字符串-EncodedCommand


[1]当您在文件资源管理器的地址栏中键入powershell.exe ,在启动PowerShell 之前将当前打开的文件夹设为工作目录,并且没有传递用于更改工作目录的启动命令; 在这种情况下, $PROFILE已经可以看到(最终)有效的工作目录。

1.打开注册表(命令: regedit

2.找出路径\\HKEY_CLASSES_ROOT\\Directory\\Background\\shell\\Powershell\\command (不是\\HKEY_CLASSES_ROOT\\Directory\\Background\\shell\\cmd\\command

3.默认值应为powershell.exe -noexit -command Set-Location -literalPath "%V"

4.您可以更改一些参数,

ps:您将命令更改为cmd.exe /s /k pushd "%V" 如果这样做,则资源管理shift & right button中的shift & right button会打开cmd,而不是powershell

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM