Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.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_Batch File_Command Line_Cmd - Fatal编程技术网

执行批处理文件时,将长Powershell命令作为参数运行

执行批处理文件时,将长Powershell命令作为参数运行,powershell,batch-file,command-line,cmd,Powershell,Batch File,Command Line,Cmd,我想通过执行.bat文件来运行以下Powershell命令: Add-Type -TypeDefinition @' using System.Runtime.InteropServices; [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IAudioEndpointVolume { // f(), g(), ...

我想通过执行
.bat
文件来运行以下Powershell命令:

Add-Type -TypeDefinition @'
using System.Runtime.InteropServices;
[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IAudioEndpointVolume
{
    // f(), g(), ... are unused COM method slots. Define these if you care
    int f(); int g(); int h(); int i();
    int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);
    int j();
    int GetMasterVolumeLevelScalar(out float pfLevel);
    int k(); int l(); int m(); int n();
    int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);
    int GetMute(out bool pbMute);
}
[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDevice
{
    int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);
}
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDeviceEnumerator
{
    int f(); // Unused
    int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);
}
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }
public class Audio
{
    static IAudioEndpointVolume Vol()
    {
        var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
        IMMDevice dev = null;
        Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));
        IAudioEndpointVolume epv = null;
        var epvid = typeof(IAudioEndpointVolume).GUID;
        Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));
        return epv;
    }
    public static float Volume
    {
        get { float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v; }
        set { Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty)); }
    }
    public static bool Mute
    {
        get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }
        set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }
    }
}
'@
[audio]::Volume  = 1
cmd
命令提示符的问题是,它将新行代码解释为执行此命令

但是,当我将所有内容输入PowerShell命令行时,它不会这样做

是否有可能通过执行批处理脚本来运行整个PowerShell脚本


我已经尝试了
powershell-command”和整个脚本“
,但也没有成功
cmd
一直认为新行意味着执行它。

如果要执行PS1文件,请尝试以下操作:

powershell.exe -executionpolicy bypass -file "YOUR_FILE_NAME.ps1"
如果要在一个批处理文件中执行所有操作,请执行以下操作:

powershell.exe
"Your Command"

您只需要将命令放入下一行。

首先,如果您有一个较长的PowerShell命令,则可以轻松达到每个
cmd
命令行的最大字符限制(我相信是~?)

此外,直接在
cmd
命令行中执行如此大的PowerShell命令是很少见的。通常应将其放入以
.ps1
结尾的文件中,然后使用以下命令执行:

powershell.exe -executionpolicy bypass -file script.ps1

如果您确实需要像您提到的那样运行PowerShell命令,则必须首先对其进行一点修改。以以下PS脚本为例:

function Say-Hello
{
   [CmdletBinding()]
   Param
   (
       [string] $name
   )
   Process
   {
        # Let's say hello!
        $str = "Hello " + $name
        Write-Output $str
   }
}
Say-Hello "Jason"

诀窍是使用文本编辑器(例如记事本+)将所有
\r\n
行结尾替换为
\n


但是,您必须首先添加一些
在许多PowerShell命令的末尾,因为这是告诉PowerShell正在发出新PowerShell命令的唯一方法。否则,PowerShell可能会将两行代码作为一行执行,因为在删除换行符后,它们看起来都是连接在一起的

然后从代码中删除所有行注释,并转义所有双引号(或者,用单引号替换它们):


现在,您可以从文本编辑器工具(我的例子是记事本+)复制它,并将其粘贴到命令行,如下所示:

powershell.exe -executionpolicy bypass -command "function Say-Hello { [CmdletBinding()] Param ([string] $name) Process { $str = 'Hello ' + $name; Write-Output $str }} Say-Hello 'Jason'"
这方面的预期产出是:

你好,杰森


这不起作用,我得到一个错误,在“here string header”之后或在一行末尾之后,不允许设置charactersokay,但是ps1文件必须包含什么?这是剧本,对吗?所以我真的需要一个全新的命令。我编辑了不起作用的答案。我的命令不只是一行。如果我执行powershell.exe“我的整个命令有几行”,它只会忽略powershell.exe之后的所有内容“直接在
cmd
命令行中执行如此大的powershell命令是很少见的”。我一直在批处理文件中嵌入大量PowerShell代码。你可以在上查看一个通用的方法,这里有很多例子,比如、、和一个很长的等等…@Aacini:谢谢你提供的信息,我不知道在PowerShell+批处理文件中开发游戏这么普遍。
powershell.exe -executionpolicy bypass -command "function Say-Hello { [CmdletBinding()] Param ([string] $name) Process { $str = 'Hello ' + $name; Write-Output $str }} Say-Hello 'Jason'"