我已经有一段时间了.我打算为我的项目创建新的PowerShell模块.目标是将多个自定义cmdlet打包到独立单元中,我可以通过我们的Nexus存储库(或通过其他任何方式)将其部署到其他计算机.
问题:我看到的每个地方,都看到教程将所有PowerShell函数/ cmdlet打包成单个*.psm1文件.文件存储在同名目录中,实际上代表模块本身.
问题:有没有办法,如何将每个cmdlet /函数分成独立文件?如果我有一个由几个cmdlet组成的模块,将它们全部放在单个*.psm1文件中并不是很方便.
谢谢马修
我有一个运行服务的C#Windows应用程序.我想利用PowerShell来提供命令行管理界面来管理我正在运行的服务.
从我的角度来看,我试图提供与Exchange 2007相同的管理界面.
您是否有任何关于如何启动/设计管理cmdlet的建议或示例代码,以便"连接"到正在运行的服务以查询或发送管理命令?
如何从powershell命令行访问服务的内部运行时状态?例如,我想实现一个名为Get-ConnectionsInfo的cmdlet,以了解执行cmdlet时Windows服务使用的出站连接数.
一个示例的实际示例或Web链接将受到欢迎.
谢谢,罗伯特
我正在编写一个需要获取全局脚本变量值的C#Cmdlet.我该怎么做?
我注意到Runspace有SessionStateProxy.GetVariable方法.我可以从C#Cmdlet访问运行空间吗?
谢谢!
我正在创建一个脚本来在我的TFS实例中执行大量移动.我有2010 TFS Power Tools提供的tfs cmdlet,但它们的get-help文档非常稀疏.具体来说,Add-TfsPendingChange似乎不支持重命名,这迫使我改为使用"tf.exe rename".
首先:我有没有错过cmdlet的文档?我已尝试使用命令的get-help,但它们不支持-detailed或-examples标志.有什么更多可用吗?
其次:我有什么理由比普通的tf.exe更喜欢任何cmdlet?除了在执行类似功能时通过管道传递对象之外,还有其他好处吗?
我想使用Powershell来调用远程机器上的批处理文件.此批处理文件包含参数.这是我到目前为止所拥有的:
$script = "\\fileshare\script.cmd"
$server = $args[0]
$args [string]::join(',',$args[1 .. ($args.count-1)])
Invoke-Command -computername $server {$script + ' ' + $args}
Run Code Online (Sandbox Code Playgroud)
经过一些搜索,我发现Invoke-Command函数在一个全新的进程中运行它的scriptblock,因此你不能在其中放入变量(它们不会被扩展).这就是-ArgumentList标签的用途.所以我尝试了这个......
Invoke-Command -computername $server {\\fileshare\script.cmd} -ArgumentList "FirstArgument"
Run Code Online (Sandbox Code Playgroud)
这也不起作用......我的批处理脚本告诉我它没有传递任何参数.我找不到任何明确说明的内容,但看起来-ArgumentList参数只适用于Powershell脚本(它不会将它们提供给批处理脚本).
有关如何使用Invoke-Command调用带参数的批处理文件的任何想法?
我正在使用普通的C#设计一个cmdlet.是否可以为参数定义默认值?
脚本cmdlet:
[Parameter] [string] $ParameterName = "defaultValue"
Run Code Online (Sandbox Code Playgroud)
哪个是C#的等价物?
[Parameter]
public string ParameterName { get; set; }
Run Code Online (Sandbox Code Playgroud)
谢谢?
我一直在编写一些使用PowerShell Cmdlet for App-V的实用程序.有趣的是,Microsoft似乎只记录了cmdlet,而不是Powershell模块后面使用的.net程序集.
现在我熟悉P/Invoke和COM Interop,我已经学会了如何使用System.Management.Automation创建一个PowerShell会话并调用cmdlet.
但有些东西对我来说没有味道.我基本上编写自己的包装类来隐藏其余代码中的powershell调用.看起来我应该a)绕过powershell并直接进入它后面的托管库,或者b)应该有更好的机制来为PowerShell cmdlet生成互操作库.
似乎微软现在大量使用PS CmdLets,它实际上已成为一个新的互操作API.
我错过了什么吗?在这种情况下使用什么是好策略?
我是Powershell开发的新手,我正在尝试用C#编写一个Powershell Cmdlet,它将用作REST API的接口.
我想有一些设置Cmdlet,用户将被提示输入REST API的Uri,用户名和密码,然后调用Cmldlets,如Get-Item,而不必输入这些参数.非常类似于Powershell的Azure提供程序,您可以通过调用Select-AzureSubscription设置当前订阅,然后再调用Save-AzureVhd而无需再输入订阅名称.
在不同Cmdlet的调用之间保持状态的最佳实践是什么?
编辑:我不确定这是解决它的最佳方法,但我所做的是我添加了一个保持状态的单例类.我有一个Cmdlet,Select-Project -Name MyProject在我的单例类中设置公共属性,然后我的其他Cmdlet可以访问该属性.
我需要在 Visual Studio 控制台中使用 C# 运行 powershell cmdlet。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Management.Automation;
using System.Threading;
using System.Management.Automation.Runspaces;
using System.Collections.ObjectModel;
using System.Collections;
namespace ConsoleApp1
{
class Program
{
private static string RunScript()
{
Runspace runSpace = RunspaceFactory.CreateRunspace();
runSpace.Open();
Pipeline pipeline = runSpace.CreatePipeline();
Command cmd = new Command("Connect-MsolService");
pipeline.Commands.Add(cmd);
ICollection results = pipeline.Invoke(); // Here exception occurs
runSpace.Close();
StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in results)
{
stringBuilder.AppendLine(obj.ToString());
}
return stringBuilder.ToString();
}
static …
Run Code Online (Sandbox Code Playgroud) 模块清单中有两个元素:cmdlet和function.
cmdlet和函数之间有什么区别?