我可以使用 Windows 文件资源管理器在任何目录中打开 PowerShell 窗口。我想每次打开一个新的 PowerShell 窗口时都运行一个脚本,并使用它在脚本中打开的当前目录。
使用$profile
让我自动执行脚本,但$pwd
变量没有用于打开 PowerShell 窗口的目录,但有C:\WINDOWS\system32
. 我了解 PowerShell 开始于C:\WINDOWS\system32
、运行$profile
和下一个与文件资源管理器一起使用的更改位置。当我的脚本从中执行时,如何获取文件资源管理器的当前目录,$profile
或者在 PowerShell 窗口打开后可能有另一种方法来自动执行我的脚本?
注意:下面的答案提供了一个基于Window 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'
顺便说一句:此快捷菜单命令的定义方式有缺陷,因为它不适用于碰巧包含'
字符的文件夹路径。
在装货的时候$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 最终解析为字符串文字而不是命令的内容中。
如果启动命令作为 Base64 编码的字符串通过-EncodedCommand
.
[1]powershell.exe
改为在文件资源管理器的地址栏中键入时,在PowerShell启动之前将当前打开的文件夹设为工作目录,并且不传递更改工作目录的启动命令;在这种情况下,$PROFILE
已经看到(最终)有效的工作目录。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句