使用pwd变量在Powershell启动时运行命令

时间:2018-08-27 18:36:11

标签: powershell registry

在文件浏览器中,您可以单击File > Open Windows Powershell(或其快速访问工具栏中的图标)以在文件浏览器所在的目录中启动Powershell实例。自动在该目录中运行一个简单命令,并在完成后关闭Powershell窗口。

我尝试将命令添加到Powershell配置文件中,但是它在设置路径变量之前执行,并且在$pwd等于C:\Users\MyUsername(我的主目录)或{{1}的情况下运行}(似乎是某种竞争条件,不知道为什么要这么做)。据我所知,这是因为文件资源管理器“在powershell按钮中打开”将打开powershell,然后将cd转到文件资源管理器中的目录。因此,当profile.ps1运行时,它使用的是唯一知道的目录,因为尚未进行cd调用。这类似于在cmd vs C:\WINDOWS\system32中运行命令start powershell.exe。前者正确运行我的配置文件命令,而后者使用cmd的当前目录而不是start powershell.exe -command "cd 'C:\wherever'"

因此,显然,从cmd中打开变量并从文件资源管理器中打开变量C:\wherever的时间是不同的。有什么方法可以延迟配置文件中命令的执行,直到完全加载外壳程序之后?简单地休眠脚本无济于事。

或者,如果有人知道如何编辑注册表,以便我可以更改单击$pwd的行为(因为它必须有权访问存储当前目录的某些变量,并且我假定它会以此方式调用Powershell可执行文件变量作为CD的参数),也可以使用。

然后,我对File > Open Windows Powershell和Powershell实例化过程的工作方式非常幼稚。

非常感谢您的帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

我以有史以来最棘手,最粗暴的方式解决了这个问题,但是如果无法轻松访问Windows内部组件,这是我可以找到的唯一可行方法。我设置了Powershell配置文件,使窗口标题成为提示符,如下所示:

function Prompt
{
  $host.ui.RawUI.WindowTitle = $(get-location)
  “PS> “
}

然后我在Task Scheduler中设置了一个任务,该任务由powershell到达其提示符触发(有3个可能的钩子,控制台启动时,启动IPC侦听线程时以及控制台何时出现)准备输入)。我用Event Viewer来做到这一点(我打算发布屏幕截图,但我还没有10个声誉)。

然后,我对此任务进行操作以运行下面显示的脚本,该脚本将从我的第一个powershell实例的窗口标题中读取

Start-Sleep -s 1
$A = Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID}
$B = $A.MainWindowTitle
& C:\Program` Files\MyProgram\MyProgram.exe "$B"
stop-process -Id $A.Id
stop-process -Id $PID

当我单击文件资源管理器中的快速访问工具栏上的小powershell图标时,整个事件的管理将以当前文件资源管理器目录作为参数正确运行我的程序(然后关闭powershell)。

答案 1 :(得分:0)

找到了一种更清洁,更快捷的方法。我要做的就是将个人资料设置为如下所示,不需要任务或Powershell的第二个实例

function Prompt
{
    & C:\Program` Files\MyProgram\MyProgram.exe "$pwd"
    stop-process -Id $PID
}