我有以下示例Powershell脚本嵌入在我的C#应用程序中.
Powershell代码
$MeasureProps = "AssociatedItemCount", "ItemCount", "TotalItemSize"
$Databases = Get-MailboxDatabase -Status
foreach($Database in $Databases) {
$AllMBStats = Get-MailboxStatistics -Database $Database.Name
$MBItemAssocCount = $AllMBStats | %{$_.AssociatedItemCount.value} | Measure-Object -Average -Sum
$MBItemCount = $AllMBStats | %{$_.ItemCount.value} | Measure-Object -Average -Sum
New-Object PSObject -Property @{
Server = $Database.Server.Name
DatabaseName = $Database.Name
ItemCount = $MBItemCount.Sum
}
}
Run Code Online (Sandbox Code Playgroud)
Visual Studio为我提供了以下嵌入选项:

我见过的每个PowerShell示例(Exchange上的 MSDN 和MSFT 开发人员中心)都要求我将Powershell命令切换为"位"并通过解析器发送.
我不想在我的应用程序中留下大量PS1文件,我需要一个没有其他"支持"PS1文件的二进制文件.
我怎样才能这样做myapp.exe是我的客户唯一看到的东西?
我找到了这个很棒的帖子:在带参数的函数上使用Invoke-Command -ScriptBlock
我正在尝试使函数call(${function:Foo})动态,因为我想传递函数名称.
我试过这个:
$name = "Foo"
Invoke-Command -ScriptBlock ${function:$name}
Run Code Online (Sandbox Code Playgroud)
但那失败了.我也尝试了各种转义序列,但是不能让函数名称变为动态.
编辑:为了清楚起见,我添加了一个小测试脚本.当然,期望的结果是打电话给ExternalFunction.
Function ExternalFunction()
{
write-host "I was called externally"
}
Function InternalFunction()
{
Param ([parameter(Mandatory=$true)][string]$FunctionName)
#working: Invoke-Command -ScriptBlock ${function:ExternalFunction}
#not working: Invoke-Command -ScriptBlock ${invoke-expression $FunctionName}
if (Test-Path Function:\$FunctionName) {
#working,but how to use it in ScriptBlock?
}
}
InternalFunction -FunctionName "ExternalFunction"
Run Code Online (Sandbox Code Playgroud) 我的电脑上有一个简单的功能
MYPC> $txt = "Testy McTesterson"
MYPC> function Do-Stuff($file) {
cd c:\temp;
$txt > $file;
}
Run Code Online (Sandbox Code Playgroud)
我想在远程计算机上运行它
MYPC> Invoke-Command -ComputerName OTHERPC { Do-Stuff "test.txt" }
Run Code Online (Sandbox Code Playgroud)
可以理解的是,Do-Stuff在OTHERPC上不存在,这不起作用.我怎么能让它工作呢?该Do-Stuff函数抽象了一些基本代码,并在其他几个地方调用,所以我不想复制它.
请注意,在我的示例中,值通过参数和范围闭包传递给函数.那可能吗?
我有一个包含日志记录功能的脚本.该函数将日志写入$ msg变量,然后将消息写入屏幕.我可以将此输出重定向到.txt文件以进行日志记录.
我需要使用invoke-command将脚本运行到多个服务器,并将日志输出写入运行脚本的计算机上的txt文件.
我试图弄清楚如何从PSSession输出写日志函数中的$ msg并返回它,以便我可以为所有服务器创建一个主日志文件.我应该创建并填充自定义对象吗?不知道如何做到这一点并从远程会话中恢复结果.
甚至可以这样做吗?
以下是我正在使用的代码示例以及日志文件输出应如下所示:
$servers = 'Server1','Server2'
$logfile = 'c:\scripts\logs\Reg-DLL-log.txt'
foreach($server in $servers){
invoke-command -cn $server -sb{
Param($server)
Function write-log{
[cmdletbinding()]
Param(
[Parameter(ValueFromPipeline=$true,Mandatory=$true)] [ValidateNotNullOrEmpty()]
[string] $Message,
[Parameter()] [ValidateSet(“Error”, “Warn”, “Info”)]
[string] $Level = “Info”,
[Parameter()] [ValidateRange(1,30)]
[Int16] $Indent = 0
)
$msg = "{0} {1}{2}:{3}" -f (Get-Date -Format "yyyy-MM-dd HH:mm:ss"), $Level.ToUpper(), (" " * $Indent), $Message
#This is output to screen
switch ($Level) {
'Error' { Write-Host ('{0}{1}' -f (" " * $Indent), $Message) -ForegroundColor 'Red'}
'Warn' …Run Code Online (Sandbox Code Playgroud) 我正在尝试将多个csv导入的列表添加到远程执行的PS脚本中.当我使用以下命令仅传递一个列表时,它工作正常:
Invoke-Command -filepath $createSAPSPath -ConnectionUri $uri -Credential $credential -ArgumentList (,$accountsList)
Run Code Online (Sandbox Code Playgroud)
多个列表对象的正确语法是什么?我试过了:
Invoke-Command -filepath $createSAPSPath -ConnectionUri $uri -Credential $credential -ArgumentList (,$accountsList),(,$groupsList)
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用......
谢谢,
格伦
对于Linux服务器上远程工作,我可以ssh再tmux继续我的工作(包括标准输出/标准错误).
如何使用Powershell在Windows服务器上获得相同的体验?我已经做了一些基本的阅读,Enter-PSSession但感觉就像没有tmux的ssh.
这个自我回答的问题侧重于 Windows [1],解决了以下几个方面:
现在有两个PowerShell 版本- 传统的、仅限Windows 的 Windows PowerShell和跨平台的 PowerShell Core,两者都可以安装在给定的 Windows 机器上:
如何判断哪个 PowerShell 版本将执行远程命令,例如 via Invoke-Command -ComputerName?
我如何通过配置针对特定版本,包括临时的和持久的?
笔记:
对于要在给定机器上通过远程处理可定位的版本,必须将其设置为远程处理:
只有Windows PowerShell中被自动设置为远程处理,但只能在服务器上运行Windows Server 2012或更高版本。
从 v7 开始,PowerShell Core还没有随 Windows 一起提供;如果您使用的是官方安装程序,则可以选择在安装过程中启用远程处理。
在任何情况下,您都可以根据Enable-PSRemoting需要(重新)启用 PowerShell 远程处理,其中:
必须从相应的版本运行。
必须以管理权限运行
[1] 也就是说,问题集中在基于WinRM的远程处理上(WinRM 是 DTMF …
在powershell中,我可以使用Catch [System.UnauthorizedAccessException]捕获“ Access is Denied”错误。如何类似地捕获RPC服务器不可用错误?
我试图使用这个天蓝色的命令行程序形式C#应用程序,这是我的天蓝色虚拟机中托管的控制台作业.这个作业自动运行一天一次,但我的azure命令行程无法执行.昨天工作正常,但一天后它无法正常工作,请帮助我.☺
注意:这里我正在做一些管理任务,我正在使用组织帐户.但它无法添加帐户其他命令行程无法正常工作.