因为一直使用的是Mac,在Mac下打开指定目录的文件,一般是用open函数,但是windows下的powershell不支持open函数

因此我们可以使用Invoke-Item命令来实现相同的功能。

Invoke-Item /path/file.txt

但是这个命令比较难以使用,因此想到了自定义一个open函数,来实现Invoke-Item同样的功能。

策略支持

首先,在Windows PowerShell中,执行以下命令

Set-ExecutionPolicy RemoteSigned

这个命令会将脚本执行策略设置为 RemoteSigned,允许你运行本地未签名的 PowerShell 脚本和函数。

会显示信息:

执行策略更改
执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如 https:/go.microsoft.com/fwlink/?LinkID=135170
中的 about_Execution_Policies 帮助主题所述。是否要更改执行策略?
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“N”):

输入Y即可。

构造函数

在PowerShell中,你可以创建一个函数实现Open命令的功能

function Open {
param (
[Parameter(Mandatory=$true)]
[string]$Path
)
Invoke-Item $Path
}

这个函数接受一个字符串类型的参数 $Path,并且使用 Invoke-Item 命令来打开指定路径的文件或者文件夹。使用时,只需要调用 Open 函数并传入需要打开的文件或文件夹的路径即可,例如:

Open C:\path\to\example.txt
Open C:\path\to\folder

但是当你重新打开PowerShell的时候,运行Open命令,还是不行,所以我们需要将函数保存在PowerShell的配置文件中。

修改PowerShell配置文件

查看PowerShell版本

不同PowerShell版本的配置文件路径不一样,因此我们可以先查看系统的PowerShell的版本。

$PSVersionTable

会显示信息

PSVersion                      5.1.19041.1320 # 这个是我们需要的版本号
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.19041.1320
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
  • PSVersion:PowerShell 的版本号。
  • PSEdition:PowerShell 的版本类型,可能的值为 Desktop(桌面版)或 Core(核心版)。
  • CLRVersion:PowerShell 运行时使用的 .NET CLR 版本。
  • BuildVersion:PowerShell 内部版本号。
  • GitCommitId:PowerShell 代码库的 Git 提交 ID。
  • OS:当前运行 PowerShell 的操作系统。

当然我们也可以只查看版本信息

$PSVersionTable.PSVersion

会显示

Major  Minor  Build  Revision
----- ----- ----- --------
5 1 19041 1320

上面显示我的PowerShell版本为5.1.19041.1320

  • 对于 Windows PowerShell v1.0 和 v2.0,配置文件的路径是 $HOME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
  • 对于 Windows PowerShell v3.0 及更高版本,配置文件的路径是 $HOME\Documents\WindowsPowerShell\profile.ps1
  • 对于 PowerShell 7 和更高版本,如果是通过 Microsoft Store 或 ZIP 文件安装的,配置文件的路径是 $HOME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1;如果是通过 MSI 安装的,配置文件的路径是 $HOME\Documents\PowerShell\profile.ps1

其中,$HOME 表示当前用户的主目录,也可以使用 $env:USERPROFILE 变量来表示。

修改配置文件

如果你无法找到 PowerShell 配置文件,可以通过在 PowerShell 中运行以下命令来创建一个新的配置文件:

New-Item -ItemType File -Path $PROFILE -Force

这个命令会在默认的 PowerShell 配置文件路径中创建一个名为 profile.ps1 的文件。你可以在这个文件中添加你的自定义函数和别名。

输入命令后,会在控制台输出配置文件的路径,直接进去目录看即可。

我的配置文件路径是C:\Users\Administrator\Documents\WindowsPowerShell/Microsoft.PowerShell_profile.ps1

打开配置文件,在其中输入

function Open {
param (
[Parameter(Mandatory=$true)]
[string]$Path
)
Invoke-Item $Path
}

# 添加 Open 别名
New-Alias open Open

在这个示例中,我们先定义了 Open 函数,然后使用 New-Alias 命令创建了一个名为 open 的别名,使其等同于 Open 函数。这样,无论你是在 PowerShell 中还是在命令行中,都可以使用 open 命令来打开指定路径的文件或文件夹了。

保存好 $PROFILE 文件后,下次打开 PowerShell 时,你就可以直接使用 open 命令了,无需再次定义 Open 函数。

其他问题

如果按照上面的步骤操作,使用open命令,还是不能正常运行的话,可能是因为 $PROFILE 文件存在语法错误或者权限问题。

你可以检查一下 $PROFILE 文件中是否有语法错误。如果有语法错误,PowerShell 会在启动时显示错误信息,并且不会加载 $PROFILE 文件。你可以使用以下命令检查 $PROFILE 文件中的语法错误:

Test-Path $PROFILE -IsValid

如果这个命令返回 False,说明 $PROFILE 文件存在语法错误。你需要检查 $PROFILE 文件中的语法,并修复错误。

另外,你还需要确保你有足够的权限来运行自定义函数和别名。如果你使用的是普通用户账户,可能需要以管理员权限运行 PowerShell 才能正常加载 $PROFILE 文件中定义的函数和别名。

如果你已经修复了 $PROFILE 文件中的语法错误,并以管理员权限运行了 PowerShell,但仍然无法正常加载 open 命令,可以尝试在 PowerShell 中显式地加载 $PROFILE 文件,看看是否能够正常运行 open 命令。你可以使用以下命令显式地加载 $PROFILE 文件:

. $PROFILE

这个命令会立即加载 $PROFILE 文件中的函数和别名,无需退出 PowerShell 并重新启动。如果 open 命令能够正常运行,说明 $PROFILE 文件本身没有问题,可能是自动加载 $PROFILE 文件的机制出了问题。你可以尝试重新打开一个新的 PowerShell 会话,看看是否能够正常加载 $PROFILE 文件中定义的函数和别名。

如果运行. $PROFILE显示错误

New-Alias : 不允许使用该别名,因为名为“open”的别名已存在

那么在配置文件里面删掉New-Alias open Open这段即可。再次重新打开PowerShell,应该能够正常运行了。