Powershell:尝试运行其文件名具有嵌入空格的脚本,而不是执行不同的,类似命名的脚本

问题描述 投票:0回答:2

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

Alter_all.ps1

如果我制作它的标准副本以保持原始完整的下一个副本,例如

Alter_all - Copy.ps1

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

EG

Alter_all-Copy.ps1

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

powershell explorer double-click
2个回答
0
投票

Arnaud Claudel's helpful answer向您展示如何从PowerShell控制台窗口或脚本调用其路径中包含嵌入空格的脚本。

在稍后的注释中,您声明您没有从命令行调用脚本,而是尝试通过双击文件资源管理器来运行它:

  • 默认情况下,出于安全原因,双击*.ps1文件不会运行它们 - 而是打开它们进行编辑。
  • 双击实际上执行你的脚本,如果他们的路径中不包含空格意味着两件事: 您的系统使用自定义配置来覆盖默认行为。 该自定义配置存在缺陷,因为它无法处理带有嵌入空格的文件路径。

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

注意:

  • 以下假定默认配置并在当前用户级别覆盖它,这不需要管理员权限。 如果您确实想要修改机器级配置,请将HKEY_LOCAL_MACHINE替换为下面的HKEY_CURRENT_USER,如注释中所述。
  • 遵守当前配置的执行策略,并加载配置文件; -NoExit用于调用powershell.exe,这意味着在脚本退出后窗口保持打开状态。 通过编辑下面的代码可以轻松调整这些行为。
  • 请注意脚本文件路径的占位符%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

2
投票

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

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

& 'Alter_all - Copy.ps1'
© www.soinside.com 2019 - 2024. All rights reserved.