为什么从批处理文件调用 PS1 脚本会导致它无法运行外部脚本?

为什么从批处理文件调用 PS1 脚本会导致它无法运行外部脚本?

我正在使用一些脚本,从批处理文件调用一些 PowerShell (.ps1) 脚本。我无法让它在这种特殊情况下工作:

我有以下批处理文件:

@echo off
TITLE Modifying Quick Access Pinned Items
color f0
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'r:\Tools\QuickAccessPin.ps1'";

QuickAccessPin.ps1:

.\Set-QuickAccess.ps1 -Action Unpin -Path "$env:userprofile\Desktop"
.\Set-QuickAccess.ps1 -Action Unpin -Path "$env:userprofile\Downloads"
.\Set-QuickAccess.ps1 -Action Unpin -Path "$env:userprofile\Documents"
.\Set-QuickAccess.ps1 -Action Pin -Path "$env:userprofile"
.\Set-QuickAccess.ps1 -Action Pin -Path "$env:userprofile\Desktop"
.\Set-QuickAccess.ps1 -Action Pin -Path "$env:userprofile\Documents"
.\Set-QuickAccess.ps1 -Action Pin -Path "$env:userprofile\Downloads"

运行批处理文件时出现错误:(我在批处理文件末尾插入了“暂停”来捕获此信息;我得到了 8 个这样的信息,这是最后一个,如 .ps1:8 所示)

.\Set-QuickAccess.ps1 : The term '.\Set-QuickAccess.ps1' is not recognized as the name of a cmdlet, function, script
file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct
and try again.
At R:\Tools\QuickAccessPin.ps1:7 char:1
+ .\Set-QuickAccess.ps1 -Action Pin -Path "$env:userprofile\Downloads
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (.\Set-QuickAccess.ps1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

我认为这可能是我的 PS1 脚本的问题,因此我在 PowerShell ISE 中打开了该文件并按 F5 运行该脚本。当我这样做时,会发生以下情况,我必须单击“运行一次”七次 - 每次针对 QuickAccessPin.ps1 中调用的每个命令单击一次

在此处输入图片描述

因此,当我直接运行 PS1 时,它虽然没有按预期工作,但仍然正常工作,但当我从批处理文件中调用它时,它根本不起作用。我还应该指出,目前为了进行测试,我的执行策略是不受限制(通常远程签名)。此外,为了消除任何问题,我还尝试运行以下命令,以便 PowerShell 不会在 GUI 中提示运行文件:

@echo off
TITLE Unblocking PowerShell Tools
color f0
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'r:\Tools\UnblockThisFolder.ps1'";
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser -Force}"

UnblockThisFolder.ps1 很简单

Get-ChildItem r:\Tools | Unblock-File

...但这似乎没有任何作用,因为 PowerShell ISE 仍提示我运行它,说如果文件是安全的,我可以“解除阻止”(我现在已经这样做了 13 次)。如果我将策略设置为 RemoteSigned,然后运行上面的脚本,然后再次运行 Get-ExecutionPolicy,它会显示 Unrestricted,因此第 4 行有效,而第 3 行似乎没有任何作用。

因此,它每次都会提示我,这只是一个小麻烦,因为这一切都是自动化的,我根本不会使用任何 GUI。但现在,我无法从批处理文件中调用 PS1 脚本,而我需要能够做到这一点,而我能让脚本运行的唯一方法是在 ISE 中手动执行。

有谁知道我该如何解决这个问题?

答案1

您收到的错误表明您可能不在您认为的目录中,并且使用完整路径执行脚本文件不会将您带入该目录 - 因此如果Set-QuickAccess.ps1R:\Tools,则不能保证您R:\Tools在执行批处理文件时处于该目录中。

您需要首先Set-Location对脚本所在的路径执行操作Set-QuickAccess.ps1

相关内容