![](/img/trans.png)
[英]where can i find the Get-WmiObject file location in 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的文件夹路径。
在加载$PROFILE
, C:\\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.