在资源管理器中使用 PowerShell 脚本打开文件

Open a file with a PowerShell script in explorer

我想使用 Windows 内置 table 查看器打开 CSV 文件,如 this SO answer 显示。

所以我希望当我在资源管理器中双击一个 CSV 文件时,下面的命令是 运行:

Import-Csv [CSV-FILE] |Out-GridView

我最终创建了两个脚本文件。一个文件名 "read_csv.bat" 其中包含:

powershell.exe -ExecutionPolicy ByPass -noexit -File %~dp0read_csv.ps1 -csvfile %1
pause

包含实际脚本的另一个文件名 "read_csv.ps1"

param (
    [Parameter(Mandatory=$true)][string]$csvfile
 )

Import-Csv $csvfile |Out-GridView

现在有没有更有效的方法,只用一个脚本文件?如果我将资源管理器设置为直接使用 POwerShell 脚本打开 CSV 文件,则会出现一条蓝色消息

This app can't run on your PC To find a version for your PC, check with your published

注:

  • 由于powershell.exe最终被调用,控制台window将总是(也)打开 当打开 CSV 文件时,因为 powershell.exe 是控制台子系统应用程序。

  • 提供替代的 GUI 子系统可执行文件以避免创建控制台 window 是 this feature request on GitHub 的主题;与此同时,还有 解决方法:

    • 中显示了基于 VBScript 的解决方案。

    • .

    • 中使用了无脚本但复杂且可能触发 AV 软件的替代方案

您需要使用批处理文件powershell.exe命令的改编版本,因为*.ps1文件是设计使然不能直接执行.

也就是说,在 CSV 文件类型的注册表定义中,使用以下命令定义 Open 动词的操作(见下文):

powershell.exe -ExecutionPolicy ByPass -NoExit -File c:\path\to\read_csv.ps1 -csvfile "%1"

请务必将 *.ps1 脚本的真实路径替换为 c:\path\to\read_csv.ps1(如有必要,请双引号);您可以使用文字路径,也可以使用基于 cmd.exe 样式的环境变量引用(例如 "%USERPROFILE%\read_csv.ps1")的路径。

或者,您可以完全不用脚本文件使用 PowerShell CLI 的
-Command参数
:

powershell.exe -ExecutionPolicy ByPass -NoExit -Command Import-Csv \"%1\" | Out-GridView

自动配置通过文件资源管理器/桌面打开 CSV 文件的命令的过程:

下面的代码修改注册表如下:

  • 定义了一个新的文件类型,PsCsvViewer,带有一个调用上面定义的 PowerShell 命令的 Open 动词(操作)。

  • .csv 文件扩展名与该新文件类型相关联。

    • 注意:重新定义后第一次打开 CSV 文件时,系统可能会提示您确认是否打算从现在开始使用 PowerShell 命令。
  • 仅为当前用户创建上面的定义,这意味着您不需要运行代码的管理员权限(写入 HKEY_CLASSES_ROOT\ 的子项需要)。

# Note the need for *3* "\", because an extra layer of escaping is
# needed for reg.exe.
$cmd = 'powershell.exe -ExecutionPolicy ByPass -NoExit -Command Import-Csv \\"%1\\" | Out-GridView'

# Create a new file type for the PowerShell command.
reg.exe add HKCU\Software\Classes\PsCsvViewer\Shell\Open\command /ve /d $cmd  /f

# Associate .csv files with the new file type.
reg.exe add HKCU\Software\Classes\.csv /ve /d PsCsvViewer /f