有一些程序不支持被直接启动,而要求通过命令行启动。这个时候,你就需要使用 PowerShell 或者 PowerShell Core 来启动这样的程序。我们都知道如何在命令行或各种终端中启动一个程序,但是当你需要自动启动这个程序的时候,你就需要知道如何通过 PowerShell 或其他命令行终端来启动一个程序,而不是手工输入然后回车运行了。
本文就介绍 PowerShell 的命令行启动参数。利用这些参数,你可以自动化地通过 PowerShell 程序来完成一些原本需要通过手工执行的操作或者突破一些限制。
一些必须通过命令行启动的程序
一般来说,编译生成的 exe 程序都可以直接启动,即便是命令行程序也是如此。但是有一些程序就是要做一些限制。比如下面的 FRP 反向代理程序:
借助 cmd.exe 来启动的方法可以参见我的另一篇博客:
- cmd.exe 的命令行启动参数(可用于执行命令、传参或进行环境配置) - 吕毅
那么我们如何能够借助于 PowerShell 或者 PowerShell 来启动它呢?
PowerShell 的帮助文档
先打开一个 PowerShell。
对于 Windows 自带的基于 .NET Framework 的 PowerShell,使用 powershell
命令可以直接启动 PowerShell。对于基于 .NET Core 版本的 PowerShell Core,使用 pwsh
命令可以直接启动。
关于 .NET Core 版本的 PowerShell Core 可以参见我的另一篇博客:
- 安装和运行 .NET Core 版本的 PowerShell - 吕毅
接下来输入下面三个命令中的任何一个:
PowerShell -Help
PowerShell -?
PowerShell /?
或者对于 PowerShell Core 来说,是下面三个命令中的任何一个:
pwsh -Help
pwsh -?
pwsh /?
你就可以看到 PowerShell 的使用说明:
PowerShell 的启动参数示例
使用 PowerShell 间接启动一个程序并传入参数
下面的命令,使用 PowerShell 间接启动 frpc.exe 反向代理程序,并给 frpc.exe 程序传入 -c ./frpc.ini
的启动参数:
1 |
|
---|
或者简写为:
1 |
|
---|
实际上使用 PowerShell 来做这些事情简直是用牛刀杀鸡,因为本身 PowerShell 非常强大。我们只是因为一些程序的限制不得不使用这样的方案来启动程序而已。
比如其中之一,执行脚本。
使用 PowerShell 执行命令/脚本后保留窗口不退出
需要加上 -NoExit
参数。
1 |
|
---|
一定要注意,-c
和后面的命令必须放到最末尾,因为 -c
后面的所有字符串都会被解析为需要执行的命令。
使用 PowerShell 执行多条命令/脚本
多条脚本之间使用 ;
作为分隔:
1 |
|
---|
如果引号里面还需要写引号,则可以把里面的引号改成单引号 '
或者把外面的引号改为单引号 '
。
使用 PowerShell 间接执行一个脚本
1 2 3 4 5 6 7 8 | Execute a PowerShell Command in a session PowerShell -Command "Get-EventLog -LogName security" # Run a script block in a session PowerShell -Command {Get-EventLog -LogName security} # An alternate way to run a command in a new session PowerShell -Command "& {Get-EventLog -LogName security}" |
---|
附 PowerShell 的全部启动参数说明
undefined
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114command = 'dir "c:program files" '
$encodedCommand = [Convert]::ToBase64String($``bytes) powershell.exe -encodedCommand
参考资料
- windows - How do I run multiple commands on one line in PowerShell? - Super User
- How to split long commands over multiple lines in PowerShell - Stack Overflow
- Stop Powershell from exiting - Stack Overflow
- Powershell 任意键退出 – PowerShell 中文博客
本文会经常更新,请阅读原文: https://blog.walterlv.com/post/powershell-startup-arguments.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected]) 。