我正在尝试学习如何从C#调用PS cmdlet,并且遇到了PowerShell类.它适用于基本用途,但现在我想执行此PS命令:
Get-ChildItem | where {$_.Length -gt 1000000}
Run Code Online (Sandbox Code Playgroud)
我尝试通过powershell类来构建它,但我似乎无法做到这一点.到目前为止这是我的代码:
PowerShell ps = PowerShell.Create();
ps.AddCommand("Get-ChildItem");
ps.AddCommand("where-object");
ps.AddParameter("Length");
ps.AddParameter("-gt");
ps.AddParameter("10000");
// Call the PowerShell.Invoke() method to run the
// commands of the pipeline.
foreach (PSObject result in ps.Invoke())
{
Console.WriteLine(
"{0,-24}{1}",
result.Members["Length"].Value,
result.Members["Name"].Value);
} // End foreach.
Run Code Online (Sandbox Code Playgroud)
我跑这个时总是遇到异常.是否可以像这样运行Where-Object cmdlet?
我正在尝试在VBscript中创建一个简单的列表,但我找不到类似的东西.
基本上,我正在使用Active目录,我需要让用户所属的所有组成为域中所有用户的成员.现在,每个用户可能是不同数量的组的成员,因此我计划使用字典,其中密钥是用户的SAMID,值是他/她所属的所有组的列表. .
我可以用静态数组做到这一点,但是我必须为数组声明一个随机的大尺寸,这是不好的.我理想的做法是有一个类似python的列表,我可以简单地做一些像myList.Add这样的事情,而不必担心调整大小.
我尝试使用System.Collection.ArrayList,但运行时遇到错误:
PS C:\tmp> cscript.exe .\foo.vbs
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.
C:\tmp\foo.vbs(1, 1) (null): 0x80131700
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
我想知道是否可以将一个小脚本传递给ScriptBlock参数但是在一行中完成所有操作?
例如,我想运行以下两个命令:
import-module lync get-csuser
如果我有一个powershell脚本文件并明确调用该文件,我可以这样做.脚本的内容如下所示
invoke-command -ComputerName mycomputer.mylab.com -ScriptBlock {
import-module lync
get-csuser
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在不将其放入临时脚本文件的情况下执行上述操作并在一个石灰上执行此操作.这可能吗?
谢谢
我正在尝试使用C#运行invoke-command cmdlet,但我无法找出正确的语法.我只想运行这个简单的命令:
invoke-command -ComputerName mycomp.mylab.com -ScriptBlock {"get-childitem C:\windows"}
Run Code Online (Sandbox Code Playgroud)
在C#代码中,我完成了以下操作:
InitialSessionState initial = InitialSessionState.CreateDefault();
Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
ps.AddCommand("invoke-command");
ps.AddParameter("ComputerName", "mycomp.mylab.com");
ps.AddParameter("ScriptBlock", "get-childitem C:\\windows");
foreach (PSObject obj in ps.Invoke())
{
// Do Something
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到一个例外:
Cannot bind parameter 'ScriptBlock'. Cannot convert the "get-childitem C:\windows" value of type "System.String" to type "System.Management.Automation.ScriptBlock".
Run Code Online (Sandbox Code Playgroud)
我猜我需要在某处使用ScriptBlock类型,但不知道该怎么做.这只是一个简单的示例,真正的用例将涉及运行一个包含多个命令的更大的脚本块,因此任何有关如何执行此操作的帮助都将受到高度赞赏.
谢谢
我正在尝试编写一些C#代码以使用PowerShell与Lync进行交互,我需要在执行Lync cmdlet之前导入Lync模块.但是,我的代码似乎没有导入模块,我不断收到"找不到get-csuser命令"异常.这是我的代码:
PowerShell ps = PowerShell.Create();
ps.AddScript(@"import-module Lync");
ps.Invoke();
ps.Commands.AddCommand("Get-csuser");
foreach (PSObject result in ps.Invoke())
{
Console.WriteLine(result.Members["Name"].Value);
}
Run Code Online (Sandbox Code Playgroud)
知道如何导入Lync模块?
这里非常简单的问题,我想看看如何在命令行上使用foreach处理一堆命令(而不是通过PS1脚本).
例如,我在控制台上显示目录列表,现在我想为每个对象执行2个命令.
Get-ChildItem | ForEach-Object { Write-Host $_ $_}
Run Code Online (Sandbox Code Playgroud)
这没关系,它显示了两次文件名,但是我想说我想为同一个对象运行2个Write-Host命令,这可能在控制台上吗?
PS:我正在尝试使用out-file cmdlet将输出写入2个文件,因此我可以读取内容并对每个对象进行2次单独的out-file调用
谢谢
这可能是一个非常noob的PowerShell问题,但是这里有.
我想在使用特定cmdlet时只选择几个属性进行显示,但是当我使用select语句将它们联系起来时,只会显示select语句中的第一个.
例如,我感兴趣的cmdlet是Get-VM
当我自己执行Get-VM时,我会得到一些默认字段:
Name State CPUUsage(%) MemoryAssigned(M) Uptime Status
---- ----- ----------- ----------------- ------ ------
everything OffCritical 0 0 00:00:00 Cannot connect to virtual machine configuration storage
SCOrch Running 0 1393 1.05:02:16 Operating normally
Server 2012 Base Image Off 0 0 00:00:00 Operating normally
Server 2012 DC Off 0 0 00:00:00 Operating normally
Run Code Online (Sandbox Code Playgroud)
现在,说我想只显示名称和状态.我试过Get-VM | select Name,State
我只返回Name列
Name
----
everything
SCOrch
Server 2012 Base Image
Server 2012 DC
Run Code Online (Sandbox Code Playgroud)
我只得到传递给返回的select语句的第一个参数,它只是忽略其他参数.我怎样才能只返回我想要的列?
提前致谢
长话短说,我需要在函数中创建大量对象.没有复制和粘贴是否可以这样做?
基本上,我所追求的效果就是这个
class foo() { .... }
void bar()
{
static foo obj1;
static foo obj2;
static foo obj3;
...
...
static foo obj501;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助深表感谢 :)
更新:看来我的动机背后的动机是必要的:)
我正在尝试创建一个测试用例来测试我们对atexit()实现的限制,以便在ARM架构上运行.限制是存在固定数量的静态对象,此时可以使用__aeabi_atexit进行注册(例如,为了论证,该数字为500).如果注册了更多对象,则该函数只返回(没有任何错误消息),导致静默失败,不是很好.现在,我已经修复了atexit()实现中的"无意义返回"位,但是需要测试修复,为了做到这一点,我需要创建至少500个静态对象.
我读过很多论坛并尝试了很多东西,但我根本无法添加我在公司代理后面的 PS 画廊,但我已经设置了我的个人资料来使用它。我正在尝试使用这些命令注册 PS 存储库
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
[system.net.webrequest]::defaultwebproxy = new-object system.net.webproxy('http://myproxy:1234')
[system.net.webrequest]::defaultwebproxy.credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
[system.net.webrequest]::defaultwebproxy.BypassProxyOnLocal = $true
Register-PSRepository -default -Proxy http://myproxy:123
Get-PSRepository
Run Code Online (Sandbox Code Playgroud)
Get-PSRepository总是返回警告WARNING: Unable to find module repositories
我使用的是 Windows Server 2012 R2。我已经通过下载外部 URL 验证了代理可以访问互联网,因此绝对不是代理不正确的问题
如何注册 PS Gallery?它让我发疯!
谢谢PS:Powershell版本
Name Value
---- -----
PSVersion 5.1.14409.1018
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.14409.1018
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
Run Code Online (Sandbox Code Playgroud)
更新
我发现我们的公司代理正在阻止对 powershellgallery 的请求,这可以解释我面临的大部分问题。该代理允许其他 http 流量,但以某种方式阻止 powershellgallery。我将与网络团队联系,并在了解更多信息后更新此线程。