运行 一个 PowerShell 脚本并自动设置无限制类似于 Bash shell hash bang
Run a PowerShell script and automatically set Unrestricted similar to Bash shell hash bang
我想在命令行环境中 运行 一个 PowerShell ps1 脚本,方法是键入脚本的名称,并且始终拥有它 运行 而无需处理 运行级别限制,不想输入 powershell
。这允许 Windows 命令行环境中的典型用户 运行 脚本,就好像它是任何其他程序一样,并且不知道涉及 PowerShell。我知道我可能无法得到完整的解决方案来回应我的 post,但此时我正在尝试一次解决一个问题。
我不想将全局限制策略更改为不受限制。我希望它暂时发生在脚本中,因为它是一个简单的操作,例如列出一些文件、过滤等。
在 Linux bash 中,我可能会像下面这样使用 hash bang,或者使用绕过选项:
#! powershell -ExecutionPolicy Unrestricted
#
# Is there a start-up option like this that can be put into a `ps1` file?
但是,我正在与没有安装任何 linux 类似环境的用户打交道,这不应该是一项要求。如果 Linux(MinGW、Cygwin、Git Bash 等)可用,用户可以 运行 脚本的 bash 版本,效果很好.我正在尝试实施等效的 Windows 解决方案。
我还可以创建一个 cmd
文件来调用 powershell 和上面的选项一样,但现在我正在将旧命令 shell 编程与 PowerShell 混合使用,并且必须分发一个cmd
和 ps1
作为解决方案的一部分。迁移到 PowerShell 会很棒,尤其是在 cmd
无法提供所需内容的情况下。能够在 PowerShell 或 cmd window 中实现 运行 脚本的解决方案会很棒......使用一个脚本。
有人可能会问我 post 代码。假设我想做一个目录列表和 return 列表中的第一个文件。一个简单的脚本相当于下面的东西,使用 Windows dir
和 linux head
,但显然我想要一个仅 Windows 的解决方案(和我希望能够编写其他 PowerShell 脚本来执行其他任务)。
dir /n /b | head -1
最后,我很想将旧的 bat
脚本迁移到 ps1
,但非程序员和非管理员用户使用命令行的障碍是这样做的一个限制。
跟进
我接受了下面的答案。我最终没有使用 PowerShell 解决方案,因为我找到了一种在 *.cmd
文件中实现的方法。这是我的收获:
- PowerShell 功能强大,但由于执行策略的复杂性和围绕它的普遍混淆,普通用户(以及我们这些支持这些用户的人)本身不太可用。
- 分发带有
.ps1
文件的 .cmd
文件是一种可能的解决方案,可以帮助以适当的执行策略启动 PowerShell,并可以使普通用户免受策略复杂性的影响,但是当然这会引入另一个问题文件来开发和维护,PowerShell 配置仍然需要工作。
- 其中 Linux 环境作为目标系统的一部分可用(例如 Git Bash、Cygwin、MinGW、Windows Bash) , 将代码编写为 bash 脚本更容易,尤其是在不需要管理员权限或由其他组件(数据库登录等)处理的情况下。
- 对于 Windows 上的简单任务,如果可能的话,弄清楚如何使用
.cmd
文件。抱歉,PowerShell,但我(还)不是拥护者,我将继续通过构建我发现的 *.cmd
脚本代码片段来蒙混过关,无论该代码多么丑陋或深奥。
不幸的是:
在Windows,你根本无法避免受到PowerShell的影响execution policies.
- 在 Unix-like 平台上,在跨平台,按需安装PowerShell (Core) edition,执行策略不适用.
调用 PowerShell CLI(powershell.exe
for Windows PowerShell, pwsh.exe
for PowerShell (Core) 7+) -ExecutionPolicy
参数可以覆盖有效策略 除非它是通过组策略设置的 。
假设您的组策略不会阻止(未签名的)脚本执行:
从在 PowerShell 中,不需要额外的努力:.ps1
文件被 PowerShell 视为与任何其他可执行文件一样,实际上执行 进程中(您无需指定 .ps1
扩展名)。
如果您还需要使 .ps1
文件可从 外部 PowerShell 执行:
在每个这样的 .ps1
文件旁边创建一个 companion .cmd
文件,内容如下:
@powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dpn0.ps1" %*
我想在命令行环境中 运行 一个 PowerShell ps1 脚本,方法是键入脚本的名称,并且始终拥有它 运行 而无需处理 运行级别限制,不想输入 powershell
。这允许 Windows 命令行环境中的典型用户 运行 脚本,就好像它是任何其他程序一样,并且不知道涉及 PowerShell。我知道我可能无法得到完整的解决方案来回应我的 post,但此时我正在尝试一次解决一个问题。
我不想将全局限制策略更改为不受限制。我希望它暂时发生在脚本中,因为它是一个简单的操作,例如列出一些文件、过滤等。
在 Linux bash 中,我可能会像下面这样使用 hash bang,或者使用绕过选项:
#! powershell -ExecutionPolicy Unrestricted
#
# Is there a start-up option like this that can be put into a `ps1` file?
但是,我正在与没有安装任何 linux 类似环境的用户打交道,这不应该是一项要求。如果 Linux(MinGW、Cygwin、Git Bash 等)可用,用户可以 运行 脚本的 bash 版本,效果很好.我正在尝试实施等效的 Windows 解决方案。
我还可以创建一个 cmd
文件来调用 powershell 和上面的选项一样,但现在我正在将旧命令 shell 编程与 PowerShell 混合使用,并且必须分发一个cmd
和 ps1
作为解决方案的一部分。迁移到 PowerShell 会很棒,尤其是在 cmd
无法提供所需内容的情况下。能够在 PowerShell 或 cmd window 中实现 运行 脚本的解决方案会很棒......使用一个脚本。
有人可能会问我 post 代码。假设我想做一个目录列表和 return 列表中的第一个文件。一个简单的脚本相当于下面的东西,使用 Windows dir
和 linux head
,但显然我想要一个仅 Windows 的解决方案(和我希望能够编写其他 PowerShell 脚本来执行其他任务)。
dir /n /b | head -1
最后,我很想将旧的 bat
脚本迁移到 ps1
,但非程序员和非管理员用户使用命令行的障碍是这样做的一个限制。
跟进
我接受了下面的答案。我最终没有使用 PowerShell 解决方案,因为我找到了一种在 *.cmd
文件中实现的方法。这是我的收获:
- PowerShell 功能强大,但由于执行策略的复杂性和围绕它的普遍混淆,普通用户(以及我们这些支持这些用户的人)本身不太可用。
- 分发带有
.ps1
文件的.cmd
文件是一种可能的解决方案,可以帮助以适当的执行策略启动 PowerShell,并可以使普通用户免受策略复杂性的影响,但是当然这会引入另一个问题文件来开发和维护,PowerShell 配置仍然需要工作。 - 其中 Linux 环境作为目标系统的一部分可用(例如 Git Bash、Cygwin、MinGW、Windows Bash) , 将代码编写为 bash 脚本更容易,尤其是在不需要管理员权限或由其他组件(数据库登录等)处理的情况下。
- 对于 Windows 上的简单任务,如果可能的话,弄清楚如何使用
.cmd
文件。抱歉,PowerShell,但我(还)不是拥护者,我将继续通过构建我发现的*.cmd
脚本代码片段来蒙混过关,无论该代码多么丑陋或深奥。
不幸的是:
在Windows,你根本无法避免受到PowerShell的影响execution policies.
- 在 Unix-like 平台上,在跨平台,按需安装PowerShell (Core) edition,执行策略不适用.
调用 PowerShell CLI(
powershell.exe
for Windows PowerShell,pwsh.exe
for PowerShell (Core) 7+)-ExecutionPolicy
参数可以覆盖有效策略 除非它是通过组策略设置的 。
假设您的组策略不会阻止(未签名的)脚本执行:
从在 PowerShell 中,不需要额外的努力:
.ps1
文件被 PowerShell 视为与任何其他可执行文件一样,实际上执行 进程中(您无需指定.ps1
扩展名)。如果您还需要使
.ps1
文件可从 外部 PowerShell 执行:在每个这样的
.ps1
文件旁边创建一个 companion.cmd
文件,内容如下:@powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dpn0.ps1" %*