执行批处理文件时,将长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'"