使用PowerShell从快捷方式打开程序

时间:2013-12-27 20:47:42

标签: powershell cmd shortcut explorer

我在创建一个在Powershell中打开某个程序的快捷方式时遇到问题。它是小型游戏服务器的一部分。因此,需要能够复制服务器文件夹,以创建另一个服务器。

程序需要以管理员模式运行。它需要适用于cmd和powershell(我不介意它们是由于语法而有2个不同的快捷方式)。到目前为止我所拥有的:

CMD:

%SystemRoot%\System32\cmd.exe /c D: & cd "D:\Path\to\server\folder\" & Server.exe

的PowerShell:

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command "cd 'D:\Path\to\server\folder\';.\Server.exe"

问题是这些路径不是相对的,所以如果我移动服务器文件夹,我需要通过替换cd命令中的路径来更改快捷方式的目标。

如果我可以使用相对路径(快捷方式与server.exe位于同一文件夹中)会更容易,但是作为PowerShell快捷方式的cmd都在system32中启动,因为它在管理模式下运行。

通过为PS创建最多1个文件和为cmd创建1个文件(lnk,bat,ps1,我不在乎),我能做些什么才能使其工作

编辑:我也尝试过以下方法,但它没有用:

C:\Windows\System32\cmd.exe /k cd & runas /user:<machine name>\<username> server.exe

问题是,首先它会问我帐户的密码(它是同一个帐户),这很烦人。其次,它在一个单独的窗口中打开服务器:一个我无法滚动或右键单击的窗口。最后,它运行的文件夹是错误的,因为它无法找到它应该在其中运行的文件夹中的文件。

有没有人有更好的主意?

3 个答案:

答案 0 :(得分:1)

经过大量的尝试和大量的血,汗水和眼泪,我终于找到了解决方法来实现它。这是我提出的唯一解决方案和我不满意的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窗口。这不是问题,因为第一个将在完成击球的最后一行后关闭,但由于某种原因,第一个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'"

答案 1 :(得分:1)

如果您希望答案不是变通方法但使用c代码:

CMD代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    system("C:\\Windows\\System32\\cmd.exe /k server.exe");
    return 0;
}
适用于PowerShell的

代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    system("C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -noexit -Command \"& '.\\server.exe'\"");
    return 0;
}

以管理员模式编译并运行。现在奇怪的是当前文件夹没问题。

如果你想拥有/ c或/ k(对于cmd)以及你想要-noexit(对于PS)

,这取决于你自己的偏好

答案 2 :(得分:0)

幸运的是,有一个简单的答案可以适用于这两个选项。

  1. 创建启动程序或脚本的快捷方式(不需要更改目录内容)
  2. 打开快捷方式的属性。
  3. 清除开始于:框,使其为空。然后,Windows将默认启动当前目录中的程序。