Powershell .ps1 脚本不会运行/不存在?

Posted

技术标签:

【中文标题】Powershell .ps1 脚本不会运行/不存在?【英文标题】:Powershell .ps1 scripts won't run / don't exist? 【发布时间】:2020-09-07 16:06:03 【问题描述】:

在过去的几周里,我在运行 powershell 脚本时开始遇到最奇怪的问题……

他们都显示这个错误信息,好像文件不存在一样?

下面的完整控制台输出显示我通过 Get-Content cmdlet 证明了该文件确实存在...

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Try the new cross-platform PowerShell https://aka.ms/pscore6

PS H:\> C:
PS C:\> cd C:\Users\Public
PS C:\Users\Public> .\test3.ps1
.\test3.ps1 : The term '.\test3.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 line:1 char:1
+ .\test3.ps1
+ ~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (.\test3.ps1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\Public> get-content test3.ps1
Get-Process | Out-GridView -Wait

PS C:\Users\Public> .\test3.ps1
.\test3.ps1 : The term '.\test3.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 line:1 char:1
+ .\test3.ps1
+ ~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (.\test3.ps1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\Public>

我已经将我的执行策略设置为无限制。

任何建议

操作系统 Windows 10 企业版 版本 1909(操作系统内部版本 18363.959)

PS C:\Users\Public>> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.18362.752
PSEdition                      Desktop
PSCompatibleVersions           1.0, 2.0, 3.0, 4.0...
BuildVersion                   10.0.18362.752
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

更新:

当设置为在 PowerShell 版本 2 中运行时,我可以获得不同的结果...

PS C:\Users\Public> powershell -version 2 -ExecutionPolicy bypass -file test3.ps1
Out-GridView : A parameter cannot be found that matches parameter name 'Wait'.
At C:\Users\Public\test3.ps1:1 char:33
+ Get-Process | Out-GridView -Wait <<<<
    + CategoryInfo          : InvalidArgument: (:) [Out-GridView], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.OutGridViewCommand

PS C:\Users\Public> powershell -version 3 -ExecutionPolicy bypass -file test3.ps1
The term 'C:\Users\Public\test3.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.
    + CategoryInfo          : ObjectNotFound: (C:\Users\Public\test3.ps1:String) [], ParentContainsErrorRecordExceptio
   n
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\Public>

大概 -Wait 参数在版本 2 中不可用。我现在可以使用它在版本 2 中运行脚本,但显然这是非常有限的功能。

更新 2:

我完全忘记了我在今年早些时候遇到了这个确切的问题;甚至在超级用户上发布了一个关于它的问题…… https://superuser.com/questions/1536086/powershell-wont-run-ps1-files

我已经标记了一个答案,我认为这是由于从使用 CAG 到 CheckPoint*** 的过渡(早在 3 月份远程工作成为一项长期工作时);进办公室直接连上网络后就莫名其妙地解决了?

不过这一次;直接连接到办公室网络无法解决问题。

最近只有其他类似的东西发生了变化;是在远程工作时 IT 设置对 Windows 密码 30 天重置的支持(之前它不起作用,因此之前在锁定期间禁用了 30 天重置)。我在八月份休假前远程重置了密码,回来后无法运行 powershell 脚本?

我曾尝试在办公室重设密码,但仍未解决问题。

我还有什么可以检查的??

【问题讨论】:

如果你使用完全限定的路径,它可以工作吗? Get-Item .\test3.ps1 |% FullName 是否返回 C:\users\public\test3.ps1 @MathiasR.Jessen 是的,它返回的正是那个 @OwlsSleeping 否,结果相同,只是错误消息显示完整路径 您可以尝试在提升的命令提示符下运行dism /online /cleanup-image /restorehealth,然后运行sfc /scannow 来修复所有Windows OS 系统文件。 【参考方案1】:

此问题归结为 AppLocker 阻止脚本运行。

为了检查这是否是您的问题的原因,请打开事件查看器并导航到

> Applications and Services Logs
> > Windows
> > > AppLocker
> > > > MSI and Script

查找任何错误日志条目,它应该说明类似

%OSDRIVE%\USERS\PUBLIC\TEST3.PS1 was prevented from running.

在我的情况下,IT 安全部门在 2 个月前应用了此更改;从那时起,IT 帮助台一直在慢慢处理投诉并将选定的文件夹目录列入白名单以解决。

出于某种原因,我的同事们本应受到的变化却没有受到影响;这让我相信这是我的机器或用户的问题。

【讨论】:

【参考方案2】:

为了不让这个问题没有答案,这里我的评论作为答案

看到您已经尝试过,我认为您系统中的一个 dll 有问题。由于 PowerShell 是 Windows 10 的一部分,据我所知,您无法卸载/重新安装它。

您可以尝试修复丢失或损坏的系统文件。

打开提升的命令提示符并运行

dism /online /cleanup-image /restorehealth

这将使用 Windows 更新来提供修复损坏所需的文件,因此需要互联网连接。如果这是不可能的,您可以使用 switch 指定另一个来源/Source:&lt;PathToFreshWindowsFiles&gt;

完成后,输入

sfc /scannow

扫描所有受保护的系统文件,并将损坏的文件替换为位于压缩文件夹“%WinDir%\System32\dllcache”中的缓存副本

这两个动作都需要相当长的时间才能完成。

完成后重新启动计算机。

【讨论】:

谢谢。仍在尝试让管理员执行此操作,但发现有关重新安装 PowerShell,因此可能会让他们先尝试...answers.microsoft.com/en-us/windows/forum/windows_10-update/… @Skytunnel 绝对值得一试,但我不确定是否禁用和重新启用 PowerShell 功能修复 dll。真的很想听听事情的进展。 抱歉耽搁了;我已升级票证,但仍在等待有人帮助我。 终于得到了 IT 支持来看看这个!.. 当 PowerShell 从我的机器以管理员身份启动时,他们能够运行脚本;这证明这是一个权限问题。还确定了从该问题开始发生之日起的事件日志,其中显示了对组策略的 14 项更改。所以现在的任务是确定它是哪个变化;但听起来需要一些时间。

以上是关于Powershell .ps1 脚本不会运行/不存在?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows IoT 核心设备上运行 powershell 脚本“.ps1”

从 Powershell ISE 中的另一个 PS1 脚本调用 PowerShell 脚本 PS1

如何运行PowerShell的脚本文件

PowerShell 基础ps1 脚本的执行策略和相关渗透思想

PowerShell 无法加载文件ps1,因为在此系统中禁止执行脚本

如何运行 PowerShell 脚本