Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从快捷方式打开带有PowerShell的程序_Powershell_Cmd_Shortcut_Explorer - Fatal编程技术网

从快捷方式打开带有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

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

该程序需要在管理员模式下运行。它需要同时适用于cmd和powershell(我不介意由于语法原因它们是两种不同的快捷方式)。到目前为止,我所拥有的:

命令:

PowerShell:

%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
问题是,首先它问我的帐户密码(它是相同的帐户),这是恼人的。其次,它在一个单独的窗口中打开服务器:在这个窗口中,我无法滚动或右键单击。最后,它操作的文件夹是错误的,因为它找不到它应该操作的文件夹中的文件


有人有更好的主意吗?

幸运的是,有一个简单的答案可以同时适用于两种选择

  • 创建启动程序或脚本的快捷方式(无需更改目录)
  • 打开快捷方式的属性
  • 清除开始位置:框,使其为空。Windows将默认在当前目录中启动程序

  • 经过大量的尝试和大量的血汗和眼泪,我终于找到了一个解决办法,使之成为现实。这是我提出的唯一解决方案,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;
    }