从快捷方式打开带有PowerShell的程序
我在创建在Powershell中打开特定程序的快捷方式时遇到问题。它是一个小型游戏服务器的一部分。因此,需要能够复制服务器文件夹,才能创建另一台服务器 该程序需要在管理员模式下运行。它需要同时适用于cmd和powershell(我不介意由于语法原因它们是两种不同的快捷方式)。到目前为止,我所拥有的: 命令: PowerShell:从快捷方式打开带有PowerShell的程序,powershell,cmd,shortcut,explorer,Powershell,Cmd,Shortcut,Explorer,我在创建在Powershell中打开特定程序的快捷方式时遇到问题。它是一个小型游戏服务器的一部分。因此,需要能够复制服务器文件夹,才能创建另一台服务器 该程序需要在管理员模式下运行。它需要同时适用于cmd和powershell(我不介意由于语法原因它们是两种不同的快捷方式)。到目前为止,我所拥有的: 命令: PowerShell: %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command "cd 'D:\Path\t
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command "cd 'D:\Path\to\server\folder\';.\Server.exe"
问题是这些路径不是相对的,因此如果我移动服务器文件夹,我需要通过替换cd命令中的路径来更改快捷方式的目标
如果我可以使用相对路径(快捷方式与server.exe位于同一文件夹中),那么就更容易了,但是作为PowerShell快捷方式的cmd和cmd都是在system32中启动的,因为它是在管理模式下运行的
通过创建最多一个PS文件和一个cmd文件(lnk、bat、ps1,我不在乎),我能做些什么使其工作
编辑:我还尝试了以下操作,但没有成功:
C:\Windows\System32\cmd.exe /k cd & runas /user:<machine name>\<username> server.exe
C:\Windows\System32\cmd.exe/k cd&runas/user:\server.exe
问题是,首先它问我的帐户密码(它是相同的帐户),这是恼人的。其次,它在一个单独的窗口中打开服务器:在这个窗口中,我无法滚动或右键单击。最后,它操作的文件夹是错误的,因为它找不到它应该操作的文件夹中的文件
有人有更好的主意吗?幸运的是,有一个简单的答案可以同时适用于两种选择
经过大量的尝试和大量的血汗和眼泪,我终于找到了一个解决办法,使之成为现实。这是我提出的唯一解决方案,cmd版本我并不完全满意。此外,它还包括一些临时文件 cmd的结果: startServerCMD.bat
SET currdir=%CD%
SET currdrive=%CD:~0,2%
echo %currdir%
echo %currdrive%
echo %currdrive% > temp.bat
attrib +H temp.bat
echo cd "%currdir%" >> temp.bat
echo server.exe >> temp.bat
shelexec\Release\ShelExec /verb:runas "temp.bat"
del /A:H temp.bat
然后我用c语言编写了一个程序,它的图标执行startServerCMD.bat
Shelexec.exe是我在网上找到的一个程序,它允许我从命令行运行程序。我没有找到一种方法可以让它在运行runas命令时不费吹灰之力地输入密码,所以这是一个很好的选择
唯一的问题是,这会打开第二个cmd窗口。这不是问题,因为第一个窗口在最后一行bat完成后将关闭,但由于某种原因,第一个cmd窗口会挂起几秒钟,然后退出
最后,我无法让图标在新的cmd窗口中工作,因为它运行的是没有图标的bat文件
PowerShell的结果:
这有点困难,但我找到了一个方法。它甚至可以更流畅地工作,并有一个工作图标
startServerPS.ps1
$currdir=$(get-location)
$target = ".\startServer.lnk"
echo "Set oWS = WScript.CreateObject(`"WScript.Shell`")" > temp.vbs
echo $("sLinkFile = `"" + $target + "`"") >> temp.vbs
echo "Set oLink = oWS.CreateShortcut(sLinkFile)" >> temp.vbs
echo "oLink.TargetPath = `"%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe`"" >> temp.vbs
echo $("oLink.Arguments = `"-Command `"`"cd '" + $currdir + "';.\server.exe`"`"`"") >> temp.vbs
echo $("oLink.IconLocation = `"" + $currdir + "\server.ico, 0`"") >> temp.vbs
echo "oLink.Save" >> temp.vbs
cscript temp.vbs
del temp.vbs
attrib +H ".\startServer.lnk"
shelexec\Release\ShelExec /verb:runas "startServer.lnk"
所以。。。这是一个PowerShell脚本,它创建一个VB脚本,该脚本创建一个打开服务器的快捷方式,然后PowerShell脚本像以前一样使用shelexec打开该快捷方式,以在管理模式下运行。这并不是一个无谓的解决方法:D
为了便于运行(无需右键单击,会为startServerPS.ps1创建一个快捷方式,但不会直接创建。目标是
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe-Command“&”。\startServerPS.ps1'
,如果您想要的答案不是解决方法,而是使用C代码:
CMD的代码:
#包括
#包括
int main()
{
系统(“C:\\Windows\\System32\\cmd.exe/k server.exe”);
返回0;
}
PowerShell的代码:
#包括
#包括
int main()
{
系统(“C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe-noexit-Command\”&“\\server.exe”\”;
返回0;
}
在管理模式下编译和运行。现在奇怪的是,当前文件夹没有问题
如果您想要使用/c或/k(对于cmd)以及-noexit(对于PS)则取决于您自己的偏好。问题是我无法创建快捷方式的快捷方式。此外,如果我将开始设置为:空,它仍将转到c:\Windows\system32,因为它是在管理员模式下运行的(这是必需的)
$currdir=$(get-location)
$target = ".\startServer.lnk"
echo "Set oWS = WScript.CreateObject(`"WScript.Shell`")" > temp.vbs
echo $("sLinkFile = `"" + $target + "`"") >> temp.vbs
echo "Set oLink = oWS.CreateShortcut(sLinkFile)" >> temp.vbs
echo "oLink.TargetPath = `"%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe`"" >> temp.vbs
echo $("oLink.Arguments = `"-Command `"`"cd '" + $currdir + "';.\server.exe`"`"`"") >> temp.vbs
echo $("oLink.IconLocation = `"" + $currdir + "\server.ico, 0`"") >> temp.vbs
echo "oLink.Save" >> temp.vbs
cscript temp.vbs
del temp.vbs
attrib +H ".\startServer.lnk"
shelexec\Release\ShelExec /verb:runas "startServer.lnk"
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("C:\\Windows\\System32\\cmd.exe /k server.exe");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -noexit -Command \"& '.\\server.exe'\"");
return 0;
}