我目前正在制作一个在我的电脑上运行的《我的世界》服务器。每次我想启动服务器时,我都必须将 TCP 隧道连接到我的 IP 以允许多人游戏,然后启动服务器。
我想自动化该过程,这样我只需双击 cmd 文件,而不必打开多个文件并键入长命令来设置隧道和启动服务器。我花了很长时间,但终于找到了一个基本的解决方案。但有一个问题。
我似乎无法让文件按预期运行:同时运行第3行和第5行(第1行只是使文件能够打开pwsh执行命令并关闭pwsh,第2行和第4行只是将目录设置为文件所在的位置)。取而代之的是 1、2 号线,但最重要的是,只有 3 号线运行。在我关闭 tcp 隧道和 powershell 窗口(它们必须保持打开状态以便服务器运行)后,第 4 行和第 5 行是否运行。
文件:start.cmd
@PowerShell -ExecutionPolicy Bypass -Command Invoke-Expression $('$args=@(^&{$args} %*);'+[String]::Join(';',(Get-Content '%~f0') -notmatch '^^@PowerShell.*EOF$')) & goto :EOF
Set-Location -LiteralPath "D:\ngrok"
.\ngrok tcp --region=us --remote-addr=9.tcp.ngrok.io:22648 22
Set-Location -LiteralPath "C:\Users\apeal\OneDrive\Desktop\SSC"
Start-Process -FilePath "run.bat"
这是我运行代码的视频: https://youtu.be/1FBJTcBXWTM
如您所见,当我运行 CMD 文件时,tcp 门户会连接,但只有在我使用(cmd + c)退出 CMD 文件后,门户才会关闭并且服务器会启动。
我正在寻找您可能拥有的任何解决方案,即使它们非常复杂,我只是希望它能够发挥作用。
像
.\ngrok tcp --region=us --remote-addr=9.tcp.ngrok.io:22648 22
这样的直接调用将使您的脚本等待直到该过程完成。 Start-Process
相反,默认情况下不会等待(不过您可以使用 -Wait
开关让它等待)。
要将参数传递给要使用
Start-Process
运行的可执行文件,您可以使用 -ArgumentList
参数。因此,只需将直接调用替换为:
Start-Process .\ngrok -ArgumentList "tcp --region=us --remote-addr=9.tcp.ngrok.io:22648 22"
你就可以开始了。