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
我正在 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'
在稍后的评论中,您声明您不是从命令行调用脚本,而是试图通过从文件资源管理器中双击来运行它:
默认情况下,出于安全原因,双击
*.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