当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell 严厉的爱

作者:精品下载站 日期:2024-12-14 08:03:07 浏览:14 分类:玩电脑

PowerShell 严厉的爱


[玩转系统] PowerShell 严厉的爱

有一天,我正在帮助 Gladys Kravitz 过渡到 VS Code。和你们中的许多人一样,她多年来一直使用 PowerShell ISE,并拥有根深蒂固的工作流程。我首先承认,过渡到 VS Code 并不容易。我记得当我进行转变时。那个挺难。但学习 PowerShell 也是如此。进入 VS Code 就像学习任何新东西一样。你需要不断的接触和重复。最终,你将建立新的肌肉记忆并开发新的工作流程。让我从今天开始对 PowerShell 表现出一点严厉的爱,帮助您打破 ISE 的陈规。是的,这只是一种开玩笑,也是一种教授一些 PowerShell 概念的方式。

杀死 ISE

Gladys 的巨大挑战可能和你们中的许多人一样,是试图打破启动 PowerShell ISE 的习惯。无论您是在 PowerShell 提示符下还是使用“开始”菜单快捷方式运行 ise 别名,都没有关系。我的想法是,如果您无法阻止自己这样做,那么为什么不让 ISE 启动并启动 VS Code?我给了 Gladys 几行代码,将其放入她的 PowerShell ISE 配置文件脚本中,该脚本启动 VS Code,然后终止 ISE。从那时起,我改进了该代码,我想我会与其他人分享它。

在此过程中存在一些假设。首先,当您安装 VS Code 时,您包含了将该应用程序包含在 %PATH% 中的选项。你可以测试一下。在 PowerShell 提示符下运行代码。如果 VS Code 启动,您就可以继续了。

ISE 配置文件脚本

PowerShell ISE 只不过是一个不同的 PowerShell 主机。因此它有自己的一组配置文件脚本。打开 PowerShell ISE 并在控制台中查看您的配置文件。

[玩转系统] PowerShell 严厉的爱

您可以看到名称中带有 ISE 的脚本。 $Profile 将是当前主机或 ISE 中当前用户的脚本。如果您有,可以运行 psedit $profile 将其打开。否则,创建一个新文件:

New-Item$profile-force-ItemTypeFile

然后在 ISE 中打开该文件。我稍后会给您添加代码。

型材加工

我的目标是尽可能快速、无缝地从 ISE 过渡到 VSCode。在测试时,我发现 ISE 需要更长的时间才能获取我插入的代码。然后我想起来了。 PowerShell 从“所有用户所有主机”开始一直到“当前用户当前主机”查找并处理 PowerShell 配置文件脚本。就我而言,也许也是您的情况,我使用的是“当前用户当前主机”配置文件脚本。该脚本定义了我非常想要的函数和 PSDrive,无论我使用的是 PowerShell ISE 还是 Windows PowerShell。 PowerShell 7 是不同的主机,因此它具有一组不同的配置文件脚本。

在“当前用户当前主机”中,我添加了一条 If 语句。

if ($host.name -notmatch "ISE") {
 . c:\scripts\jdh-functions.ps1
 . c:\scripts\jdh-aliases.ps1
 . c:\scripts\jdh-variables.ps1
 . c:\scripts\jdh-psdrives.ps1
...
}

现在,当 ISE 启动并处理此配置文件脚本时,它不会执行任何操作。我也可以走这条路。

If ($host.name -match "ISE") {
  Return
 }

现在是艰难的爱。在 PowerShell ISE 的配置文件脚本的开头插入此代码。

$WindowState=Add-Type-MemberDefinition@'
[DllImport("user32.dll")]
publicstaticexternboolShowWindowAsync(IntPtrhWnd,intnCmdShow);
'@-Name"WindowState"-NamespaceWin32Functions-PassThru

#getthecurrentprocess
$me=Get-Process-Id$pid

#minimizetheISE
$WindowState::ShowWindowAsync($me.MainWindowHandle,2)

#see if a path was specified
#split on arguments, trimming blank items
 $c = (Get-CimInstance -class win32_process -Filter "processid = $pid" -Property Commandline).Commandline.Split() | Where-object {$_}
 #Launch VSCode, assuming you added it to your path
 $cmd = Get-Command code.cmd
 if ($c.count -gt 1) {
   #pass each file name to VSCode
   $c[-1].split(",").foreach( { &$cmd.source (Resolve-Path $_).Path })
 }
 else {
   &$cmd.source
 }

#GracefullyclosetheISE
$me.CloseMainWindow()

这就是发生的事情。

当我启动 PowerShell ISE 时,我想假装我没有启动。因此,代码的第一部分是创建一个从 Win32API 构建的自定义类型。这让我可以最小化 PowerShell ISE 窗口。最小化时,我使用 Get-CimInstance 来获取 PowerShell ISE 进程。这是因为我想检查任何文件名。如果我运行 ise .\get-it.ps1之类的命令,我希望 VSCode 也打开 .\get-it.ps1。 WMI 向我提供此信息。如果我要启动多个文件,这些文件将被检测为逗号分隔的字符串,我可以将其拆分。

如果我像往常一样使用 ISE 别名,那就没问题了。但有一个问题。 VS Code 允许我打开整个文件夹:

code c:\scripts\psfunctioninfo

但如果我使用 ISE 别名尝试相同的操作,则会收到错误消息。但是,当我单击“确定”消除错误时,VS Code 实际上会打开该文件夹。

建立此 PowerShell ISE 配置文件后,无论我如何启动 ISE,VS Code 都会打开,而 ISE 将关闭。

但我真的需要 ISE

如果由于某种原因您确实想在输入此代码后进入 ISE,您所需要做的就是从控制台提示符启动 ISE。

ise -noprofile

但我希望,随着时间的推移,您将不再选择 PowerShell ISE 作为编辑器,而转向 VSCode。因此,如果你一直在努力改掉这个习惯,那就表现出一点严厉的爱吧。未来的你会感谢你。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯