Powershell:尝试 运行 文件名中嵌入空格的脚本会执行另一个名称相似的脚本

Powershell: attempting to run a script whose filename has embedded spaces executes a different, similarly named script instead

我正在 w2008R2 下执行 PS 脚本。 例如

Alter_all.ps1

如果我制作标准副本以保持原件完好无损,则制作下一个副本 例如

Alter_all - Copy.ps1

如果我尝试执行新编辑的脚本 Alter_all - 复制。ps1 它无论如何都会运行以前脚本的内容。为了解决这个问题,我发现我需要将脚本重命名为没有 spaces,然后脚本才能使用新值

例如

Alter_all-Copy.ps1

Powershell 似乎以某种方式检查了脚本的名称,但停在空的 space 名称处,认为您正在执行与之前执行的脚本相同的脚本? 这背后的原因是什么?

这是因为 - Copy.ps1 作为参数传递。

尝试使用以下语法执行您的新脚本:

& 'Alter_all - Copy.ps1'

向您展示如何从 PowerShell 控制台 window 或脚本 调用其路径中包含嵌入空格的脚本 window.

在稍后的评论中,您声明您不是从命令行调用脚本,而是试图通过从文件资源管理器中双击来运行它:

  • 默认情况下,出于安全原因,双击 *.ps1 文件不会 运行 它们 - 相反,它们会打开 编辑.

  • 如果脚本的路径中不包含空格,那么双击实际上会执行您的脚本,这意味着两件事:

    • 您的系统使用覆盖默认行为的自定义配置
    • 该自定义配置存在缺陷,因为它无法处理带有嵌入空格的文件路径。

因此,您需要通过编辑注册表来修复您的自定义配置

注:

  • 以下采用默认配置并在当前用户级别覆盖它,这不会需要管理员权限。

    • 如果您确实要修改 机器级别 配置,请将 HKEY_LOCAL_MACHINE 替换为下面的 HKEY_CURRENT_USER,如评论中所述。
  • 遵守当前配置的执行策略,加载配置文件; -NoExit 用于调用 powershell.exe,这意味着 windows 在脚本退出后保持打开状态。

    • 可以通过编辑以下代码轻松调整这些行为。
  • 请注意脚本文件路径的占位符 %1 是如何包含在 \"...\" 中的,以确保即使带有嵌入空格的路径也作为单个参数传递给 powershell.exe-File参数。

# Create temp. file for registry definitions.
$tmpFile = [IO.Path]::GetTempFileName()

# Change this to 'HKEY_LOCAL_MACHINE' to override
# the machine-level configuration - REQUIRES RUNNING AS ADMIN.
$rootKey = 'HKEY_CURRENT_USER'

# Create the registry definitions...
@"
Windows Registry Editor Version 5.00

[$rootKey\Software\Classes\Microsoft.PowerShellScript.1\shell\Open\command]
@="$($PSHOME -replace '\', '\')\powershell.exe -NoExit -File \"%1\" %*"
"@ > $tmpFile

# ... and import them.
reg.exe import $tmpFile

# Clean up.
Remove-Item -LiteralPath $tmpFile