天道酬勤,学无止境

PowerShell DSC - 如何将配置参数传递给 ScriptResources?(PowerShell DSC - how to pass configuration parameters to ScriptResources?)

问题

我在尝试使用 PowerShell 所需状态配置脚本来配置内部应用程序时遇到了很多麻烦。 问题的根源在于我似乎无法将我的配置数据传递到 ScriptResource(至少不是我尝试这样做的方式)。

我的脚本应该为我们的内部应用程序创建一个 config 文件夹,然后将一些设置写入文件:

configuration MyApp {
    param (
        [string[]] $ComputerName = $env:ComputerName
    )
    node $ComputerName {

        File ConfigurationFolder {
            Type = "Directory"
            DestinationPath = $Node.ConfigFolder
            Ensure = "Present"
        }

        Script ConfigurationFile {
            SetScript = {
                write-verbose "running ConfigurationFile.SetScript";
                write-verbose "folder = $($Node.ConfigFolder)";
                write-verbose "filename = $($Node.ConfigFile)";
                [System.IO.File]::WriteAllText($Node.ConfigFile, "enabled=" + $Node.Enabled);
            }
            TestScript = {
                write-verbose "running ConfigurationFile.TestScript";
                write-verbose "folder = $($Node.ConfigFolder)";
                write-verbose "filename = $($Node.ConfigFile)";
                return (Test-Path $Node.ConfigFile);
            }
            GetScript = { @{Configured = (Test-Path $Node.ConfigFile)} }         
            DependsOn = "[File]ConfigurationFolder"
        }

    }
}

作为参考,我的配置数据如下所示:

$config = @{
    AllNodes = @(
        @{
            NodeName = "*"
            ConfigFolder = "C:\myapp\config"
            ConfigFile = "C:\myapp\config\config.txt"
        }
        @{
            NodeName = "ServerA"
            Enabled = "true"
        }
        @{
            NodeName = "ServerB"
            Enabled = "false"
        }
    )
}

我正在应用以下 DSC:

$mof = MyApp -ConfigurationData $config;
Start-DscConfiguration MyApp –Wait –Verbose;

当我应用此配置时,它很高兴地创建了文件夹,但无法对配置文件执行任何操作。 查看下面的输出,很明显这是因为 $Node 变量在 ConfigurationFile / TestScript 的范围内为空,但我不知道如何从该块中引用它。

LCM:  [ Start  Resource ]  [[Script]ConfigurationFile]
LCM:  [ Start  Test     ]  [[Script]ConfigurationFile]
                           [[Script]ConfigurationFile] running ConfigurationFile.TestScript
                           [[Script]ConfigurationFile] node is null = True
                           [[Script]ConfigurationFile] folder =
                           [[Script]ConfigurationFile] filename =
LCM:  [ End    Test     ]  [[Script]ConfigurationFile]  in 0.4850 seconds.

我已经花了一整天的时间在网上搜索这个特定的问题,但是所有变量、参数和配置数据的示例都使用文件和注册表资源或其他非脚本资源,这些资源我已经在“ConfigurationFolder " 阻止我的脚本。 我遇到的问题是如何从像我的“ConfigurationFile”这样的脚本资源中引用配置数据。

我画了一个完整的空白,所以任何帮助将不胜感激。 如果所有其他方法都失败了,我可能必须为每个服务器创建一个单独的“配置”脚本并对值进行硬编码,如果可能的话,我真的不想这样做。

干杯,

麦克风

回答1

ConfigurationData 仅在编译 MOF 文件时存在,在 DSC 引擎应用您的脚本时不存在。 Script 资源的 SetScript、GetScript 和 TestScript 属性实际上是字符串,而不是脚本块。

可以生成这些脚本字符串(已经扩展了 ConfigurationData 中的所有必需数据),但是您必须小心正确使用转义符、子表达式和引号。

我在 http://social.technet.microsoft.com/Forums/en-US/2eb97d67-f1fb-4857-8840-de9c4cb9cae0/dsc-configuration-data-for-脚本资源?论坛=winserverpowershell

回答2

将此: $Node.ConfigFolder更改为$using:Node.ConfigFolder

如果您有一个名为$Foo的变量,并且希望将其传递给脚本 DSC 资源,请使用$using:Foo

回答3

根据 David 的回答,我编写了一个实用函数,它将我的脚本块转换为字符串,然后执行非常简单的搜索和替换以扩展对配置数据的引用,如下所示。

function Format-DscScriptBlock()
{
    param(
        [parameter(Mandatory=$true)]
        [System.Collections.Hashtable] $node,
        [parameter(Mandatory=$true)]
        [System.Management.Automation.ScriptBlock] $scriptBlock
    )
    $result = $scriptBlock.ToString();
    foreach( $key in $node.Keys )
    {
        $result = $result.Replace("`$Node.$key", $node[$key]);
    }
    return $result;
}

我的 SetScript 然后变成:

SetScript = Format-DscScriptBlock -Node $Node -ScriptBlock {
                write-verbose "running ConfigurationFile.SetScript";
                write-verbose "folder = $Node.ConfigFolder";
                write-verbose "filename = $Node.ConfigFile)";
                [System.IO.File]::WriteAllText("$Node.ConfigFile", "enabled=" + $Node.Enabled);
            }

您必须注意配置数据中的引号和转义符,因为 Format-DscScriptBlock 仅执行文字替换,但这对我的目的来说已经足够了。

回答4

解决此问题的一种非常优雅的方法是使用常规的{0}占位符。 通过应用-f运算符,占位符可以替换为其实际值。

这种方法的唯一缺点是不能将大括号 { } 用于占位符以外的任何内容(即哈希表或 for 循环),因为-f运算符要求大括号包含整数。

您的代码如下所示:

        SetScript = ({ 
            Set-ItemProperty "IIS:\AppPools\{0}" "managedRuntimeVersion" "v4.0"
            Set-ItemProperty "IIS:\AppPools\{0}" "managedPipelineMode" 1 # 0 = Integrated, 1 = Classic
        } -f @($ApplicationPoolName))

此外,确定您是否做得对的一个好方法是使用文本编辑器查看生成的 .mof 文件; 如果您查看生成的 TestScript / GetScript / SetScript 成员,您会发现代码片段实际上是一个字符串。 $placeholder 值应该已经在那里被替换了。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • PowerShell DSC - how to pass configuration parameters to ScriptResources?
    I'm having a lot of trouble trying to get a PowerShell Desired State Configuration script working to configure an in-house application. The root of the problem is that I can't seem to pass my configuration data down into a ScriptResource (at least not with the way I'm trying to do it). My script is supposed to create a config folder for our in-house application, and then write some settings into a file: configuration MyApp { param ( [string[]] $ComputerName = $env:ComputerName ) node $ComputerName { File ConfigurationFolder { Type = "Directory" DestinationPath = $Node.ConfigFolder Ensure =
  • 从C#向Powershell传递参数(passing parameters to powershell from c#)
    问题 我正在尝试从C#Web应用程序将参数传递给PowerShell,但始终收到错误消息: 原因= {“术语'Param($ ds)\ r \ n \ r \ n $ ds \ r \ n \ r \ n \ r \ n'不被识别为cmdlet,函数,脚本文件的名称,或可运行的程序。请检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后重试。“} 我的Powershell脚本如下: Param($ds) write-host $ds 我的C#是: protected void drpCluster_SelectedIndexChanged(object sender, EventArgs e) { // Looping through all the rows in the GridView foreach (GridViewRow row in GridVMApprove.Rows) { if (row.RowState == DataControlRowState.Edit) { // create dynamic dropDowns for datastores DropDownList drpDatastore = (DropDownList)row.FindControl("drpDatastore"); DropDownList drpCluster =
  • 如何将命令行参数传递给PowerShell ps1文件(How to pass command-line arguments to a PowerShell ps1 file)
    问题 多年以来,我一直使用cmd/DOS/Windows shell并将命令行参数传递给批处理文件。 例如,我有一个文件zuzu.bat并在其中访问%1 , %2等。现在, when I am in a Cmd.exe shell调用PowerShell脚本when I am in a Cmd.exe shell ,我想做同样的事情。 我有一个脚本xuxu.ps1 (并且我已将PS1添加到我的PATHEXT变量中,并与PowerShell关联了PS1文件)。 但是,无论我做什么,我似乎都无法从$args变量中获取任何信息。 它的长度始终为0。 如果我在PowerShell Shell中,则可以使用cmd.exe而不是cmd.exe (当然)。 但是我还不够舒适,无法全职生活在PowerShell环境中。 我不想键入powershell.exe -command xuxu.ps1 p1 p2 p3 p4 。 我想输入xuxu p1 p2 p3 p4 。 这可能吗?如果可以,怎么办? 我无法上班的示例很简单,foo.ps1: Write-Host "Num Args:" $args.Length; foreach ($arg in $args) { Write-Host "Arg: $arg"; } 结果总是这样的: C:\temp> foo Num Args: 0 C:\temp>
  • 如何将多个字符串参数传递给 PowerShell 脚本?(How do I pass multiple string parameters to a PowerShell script?)
    问题 我正在尝试进行一些字符串连接/格式化,但它将所有参数放入第一个占位符中。 代码 function CreateAppPoolScript([string]$AppPoolName, [string]$AppPoolUser, [string]$AppPoolPass) { # Command to create an IIS application pool $AppPoolScript = "cscript adsutil.vbs CREATE ""w3svc/AppPools/$AppPoolName"" IIsApplicationPool`n" $AppPoolScript += "cscript adsutil.vbs SET ""w3svc/AppPools/$AppPoolName/WamUserName"" ""$AppPoolUser""`n" $AppPoolScript += "cscript adsutil.vbs SET ""w3svc/AppPools/$AppPoolName/WamUserPass"" ""$AppPoolPass""`n" $AppPoolScript += "cscript adsutil.vbs SET ""w3svc/AppPools/$AppPoolName/AppPoolIdentityType"" 3"
  • PowerShell DSC 复合资源(PowerShell DSC Composite Resources)
    问题 我已成功创建 DSC 配置并将它们部署到服务器上。 作为下一步,我尝试将服务器中常见的配置块部分分解为可重用的部分,或者用 DSC 的说法是“复合资源”。 经过大量研究,我仍然无法使用复合资源,运行“Get-DSCResource”时未列出它们。 查看“Get-DSCResource”函数后,它似乎需要一个“DSCResources”子文件夹,PowerShell.org 电子书没有说明,但 PowerShell 博客有。 Get-DSCResources 函数使用资源名称(示例中的 SimpleConfig)调用 Get-Module。 当根文件夹中没有 psd1 时,两者都不考虑 Get-Module 不“看到”子文件夹(示例中的 BaseConfiguration)。 我调整了这些方法,产生了下面的例子,但也没有成功。 我看过: PowerShell 博客 PowerShell.org 电子书 Steven Murawski 的 DSC 系列 Steven Murawksi 的 DSC 用户组演示文稿 示例配置: # $env:ProgramFiles\WindowsPowerShell\BaseConfiguration\BaseConfiguration.psd1 @{ ModuleVersion = '1.0' GUID = '84f449fd-8f26-4bb9
  • 如何在PowerShell中将多个参数传递给函数?(How do I pass multiple parameters into a function in PowerShell?)
    问题 如果我有一个接受多个字符串参数的函数,则第一个参数似乎会获取分配给它的所有数据,而其余参数将作为空传递。 快速测试脚本: Function Test([string]$arg1, [string]$arg2) { Write-Host "`$arg1 value: $arg1" Write-Host "`$arg2 value: $arg2" } Test("ABC", "DEF") 生成的输出是 $arg1 value: ABC DEF $arg2 value: 正确的输出应为: $arg1 value: ABC $arg2 value: DEF 这在多台计算机上的v1和v2之间似乎是一致的,因此很显然,我在做错事。 谁能指出到底是什么? 回答1 在PowerShell(所有版本)中,函数调用中的参数以空格分隔,而不是逗号分隔。 另外,括号完全不必要,如果Set-StrictMode -Version 2或更高版本有效,则在PowerShell 2.0(或更高版本)中会引起解析错误。 带括号的参数仅在.NET方法中使用。 function foo($a, $b, $c) { "a: $a; b: $b; c: $c" } ps> foo 1 2 3 a: 1; b: 2; c: 3 回答2 已经提供了正确的答案,但是此问题似乎普遍存在
  • 使用Powershell将空参数传递给可执行文件(Passing empty arguments to executables using powershell)
    问题 当传递给命令时,Powershell似乎会丢弃空字符串参数。 我有这个代码 PS D:\> $b.name = "foo bar" PS D:\> ./echoargs $b.name Arg 0 is D:\echoargs.exe Arg 1 is foo bar PS D:\> $b.name = "" PS D:\> ./echoargs $b.name Arg 0 is D:\echoargs.exe 您可以假定$ b有一个“名称”成员。 即使值是一个空字符串,我如何将其作为参数传递给exe。 我尝试使用呼叫运算符没有成功。 回答1 如果您想显示一个空字符串,请尝试在参数周围使用转义引号,如下所示: PS> $b = [psobject]@{name = ''} PS> echoargs `"$($b.Name)`" Arg 0 is <> Command line: "C:\Users\Keith\Pscx\Trunk\Src\Pscx\bin\Release\Apps\EchoArgs.exe" "" 请注意,我在V3上进行了测试,因此不确定在V2上的行为是否完全相同。 回答2 尝试传递用双引号引起来的空单引号字符串,反之亦然。 ./echoargs $b.name, "''" 或者 ./echoargs $b.name, '""' 回答3 这也应该起作用:
  • 有没有一种方法可以通过启动过程将可序列化的对象传递给PowerShell脚本?(Is there a way to pass serializable objects to a PowerShell script with start-process?)
    问题 我了解PowerShell作业,但是我想使用启动过程并将可序列化的对象传递给新的powershell进程。 有什么办法吗? 看来,使用启动过程,您必须提供一个字符串参数列表,该列表对我而言不会有用。 我正在尝试将PSCredential从一个进程转移到另一个进程(或SecureString,我将选择其中一个)。 也许这绕过了安全性。 更新-添加在看到别人的帮助后使用的解决方案(使用@PetSerAl的解决方案) 我编写了两个测试脚本:一个父脚本和一个子脚本。 父脚本调用子脚本。 父脚本: $securePassword = ConvertTo-SecureString "testpassword" -AsPlainText -Force $cred = New-Object PSCredential("testuser", $securePassword) $credSerial = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes([Management.Automation.PSSerializer]::Serialize($cred))) $psFile = "C:\repos\Test\PowerShell Scripts\KirkTestChild.ps1" $p1 = "-someparam "
  • 将哈希表作为参数传递给PowerShell中的函数(Passing a hashtable as an argument to a function in PowerShell)
    问题 我在PowerShell脚本中遇到问题: 当我想将哈希表传递给函数时,该哈希表不被识别为哈希表。 function getLength(){ param( [hashtable]$input ) $input.Length | Write-Output } $table = @{}; $obj = New-Object PSObject;$obj | Add-Member NoteProperty Size 2895 | Add-Member NoteProperty Count 5124587 $table["Test"] = $obj $table.GetType() | Write-Output ` Hashtable $tx_table = getLength $table `Unable to convert System.Collections.ArrayList+ArrayListEnumeratorSimple in System.Collections.Hashtable 为什么? 回答1 $Input是一个自动变量,它枚举给定的输入。 选择任何其他变量名称,它将起作用-尽管不一定像您期望的那样-获取哈希表中的条目数,您需要检查Count属性: function Get-Length { param( [hashtable]$Table ) $Table
  • AzureVM扩展之DSC
    之前的博文介绍过AzureVM扩展的一些内容,AzureVM extension的国际版和国内版是有挺大区别的,从功能丰富程度来看,国际版目前是要比国内多很多内容的,且即便是相同的功能,可能版本号也不一致,像BGInfo啊,Access管理之类的比较常用,此外还有Docker扩展目前只在preview版本的新门户中才可以直观的看到,这次为了迎合前两篇PowerShell DSC的主题特地选择了AzureVM Extension中的DSC扩展来做介绍,也是想说明一下DSC这种强大编辑的自动化运维手段是可以无缝扩展到云端的。###################################################################想在Azure中使用DSC对VM进行维护,方法与本地基本一致,只是在执行时需要通过Azure的PowerShell方法来实现,下图我做了一个非常简单的实例,在本地安装web-server角色,并把脚本保存为叫“111”的*.ps1文件:之后执行publish-azurevmdscconfiguration,并制定ps1文件的本地路径,这条命令将会把本地的ps1脚本打包成azure可以识别的zip格式,然后上传到当前操作订阅中的blob容器内:此时我在我的blob内找到了名为“windows-powershell-dsc”的容器
  • 在部署过程中,如何自动分配所需的状态配置自定义资源?(How do you automatically distribute Desired State Configuration custom resources as part of a deployment?)
    问题 我正在努力利用Microsoft的DSC资源工具包(至少对于初学者来说特别是XWebAdministration)。 我对DSC比较熟悉,因此不必担心脚本的实际功能……它确实可以实现预期的功能,或者至少我可以肯定地做到这一点。 问题是,当我从业务流程框中执行脚本时,我要定位的服务器返回此错误: The PowerShell provider xWebAdministration does not exist at the PowerShell module path nor is it registered as a WMI provider. + CategoryInfo : InvalidOperation: (root/Microsoft/...gurationManager :String) [], CimException + FullyQualifiedErrorId : ModuleNameNotFound + PSComputerName : [redacted] 发生这种情况的原因很明显:我没有在那些机器上安装xWebAdministration模块。 问题是:在部署过程中自动分配自定义资源的正确方法是什么? 在几十个或几百个盒子上手动安装自定义资源很麻烦,因此必须有一种方法,我只是在任何地方都看不到任何有关此主题的文档。 回答1 留意以下内容 http:/
  • Powershell卸载模块…完全(Powershell Unload Module… completely)
    问题 我正在调试Powershell项目。 我正在使用Import-Module从我的C#dll加载PS模块,并且一切正常。 调用Remove-Module并不能完全卸载模块,因为DLL仍然被锁定并且无法删除。 有没有一种方法可以让PSH完全卸载模块并释放DLL,以便我可以使用Import-Module复制并重新加载它,而无需重新启动PSH控制台? 更新因此,如果将模块加载到单独的AppDomain中,它是否仍像普通模块一样工作? 任何人都可以提供示例吗? 回答1 有一种解决方法。 打开另一个PowerShell实例: PS > powershell PS > [load DLL] PS > [do work] PS > exit 退出后,您将返回到进行调用的PowerShell实例(假设您在PowerShell实例内部和PowerShell实例中进行了powershell调用)。 您可以将任何常规参数传递给powershell ,因此可以使用-Co​​mmand或-File。 例如, PS > powershell -Command '[load DLL]; [do work]' # Executes a command and exits PS > powershell -Command '.\myscript.ps1 param1 param2' # Executes the
  • Jenkins:在Powershell中访问全局密码(Jenkins: Access global passwords in powershell)
    问题 我无法在Powershell中将jenkins全局密码作为环境变量进行访问。 我已经做了以下工作。 不知道我还缺少什么。 已安装的凭证绑定插件,环境注入器插件,掩码密码插件,Hudson PowerShell插件在管理凭据中以gluser身份创建了全局密码条目在我的构建中,我进行了一个powershell调用,其中定义了构建环境,用于将密码作为环境变量注入到构建中,并检查全局密码。 以下所有内容均无法使我在Powershell脚本中引用全局密码$env:gluser $gluser 他们似乎都不让我在Jenkins的powershell调用中访问全局密码。 有人可以帮忙吗? 回答1 不要混淆EnvInject插件和Credentials Binding插件。 两者的功能截然不同,但是两者都允许全局管理密码,但方式有所不同。 EnvInject方式 管理詹金斯->配置系统在全局密码下点击添加。 输入名称(环境变量的名称)和密码。 作业->配置在建环境选中将密码作为环境变量注入到构建中。 检查全局密码。 检查掩码密码参数。 凭证绑定方式 管理詹金斯->管理凭据单击添加凭据(无域)。 选择带密码的用户名或密文。 输入用户名和密码或密码。 作业->配置在建环境选中使用秘密文本或文件。 在“绑定”下,单击“添加” 。 选择用户名和密码或秘密文本。 输入您要保留凭据值的变量名。
  • 使用命令行参数从C#执行PowerShell脚本(Execute PowerShell Script from C# with Commandline Arguments)
    问题 我需要从C#中执行PowerShell脚本。 该脚本需要命令行参数。 到目前为止,这是我所做的: RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create(); Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration); runspace.Open(); RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace); Pipeline pipeline = runspace.CreatePipeline(); pipeline.Commands.Add(scriptFile); // Execute PowerShell script results = pipeline.Invoke(); scriptFile包含类似“ C:\ Program Files \ MyProgram \ Whatever.ps1”的内容。 该脚本使用命令行参数,例如“ -key Value”,而Value可以是类似路径的内容,也可能包含空格。 我没有这个工作。 有谁知道如何从C#中将命令行参数传递给PowerShell脚本,并确保空格没有问题? 回答1
  • 如何在 PowerShell 中将命名参数定义为 [ref](How to define named parameter as [ref] in PowerShell)
    问题 我正在尝试使用[ref]命名参数。 但是,我收到一个错误: workflow Test { Param([Parameter(Mandatory=$true)][String][ref]$someString) write-verbose $someString -Verbose $someString = "this is the new string" } cls $someString = "hi" Test -someString [ref]$someString write-host $someString #Error: Cannot process argument transformation on parameter 'someString'. Reference type is expected in argument. 我该如何解决这个问题? 回答1 我注意到您在 [ref] 参数示例中使用了“工作流程”。 为简单起见,我们称其为“函数”,稍后再回到“工作流程”。 您需要在代码中更改三件事: 将 [ref] 参数传递给函数时,需要将参数括在括号() 。 在函数中使用 [ref] 参数时,请参考 $variable.value 从参数定义中删除 [string] 类型。 它可以是 [string] 或 [ref],但不能同时是两者。 这是有效的代码:
  • Windows管理框架WMF总览
    Windows管理框架WMF总览Windows管理框架WMF是基于Windows的,跨服务器的一致性管理接口的架构。它包含如下特性: Windows PowerShell Windows PowerShell Desired State Configuration (DSC) Windows PowerShell Integrated Script Environment (ISE) Windows Remote Management (WinRM) Windows Management Instrumentation (WMI) Windows PowerShell Web Services (Management OData IIS Extension) Software Inventory Logging (SIL) Server Manager CIM ProviderWindows Remote Management 架构Windows Management Instrumentation 架构对于DBA来说,可以利用WMI做以下两个方面的监控:1. 使用WMI Provider for Server Events创建SQL Server Agent告警。2. 使用Powershell订阅WMI产生的事件。Windows PowerShell Desired State
  • 如何获取 TFS2015 Build (Build.vnext) 和 NuGet 包还原以使用自定义包源(How to get TFS2015 Build (Build.vnext) and NuGet package restore to use custom package sources)
    问题 我正在尝试让我们的 TFS2015 Build (TFSBuild vnext) 与 VS Team Services 一起运行。 到目前为止,大多数博客和文档都很有帮助,但在尝试构建使用自定义包源进行 NuGet 自动包还原的项目时除外。 我已经成功部署了一个团队服务构建代理(构建的新机制),一切似乎都很顺利,直到还原 NuGet 包的构建任务失败。 失败是由于未从已安装的 VS 配置中提取自定义/私有包源,因此无法找到这些包。 来自默认 NuGet 包源的传统包确实没有问题地恢复。 使用代理时,如何为 NuGet 指定要使用的其他包源? 编辑:vcastro 询问了 NuGet 安装程序构建步骤并在该构建步骤的配置中定义路径。 以上是使用 Visual Studio Build 步骤和集成选项来拥有 NuGet 还原包。 请参阅此图像以供参考: 回答1 或者,您还可以在构建配置中的Visual Studio Build步骤之前添加NuGet Installer构建步骤,以还原所有 NuGet 包。 在那里,您可以将私有nuget.exe的位置作为参数传递给nuget.exe : -source "https://www.nuget.org/api/v2/;http://mynugetserver" 回答2 我在网上搜索并收效甚微,但在摆弄以下内容后会有所帮助: OK 看来
  • 如何在Windows批处理文件中运行PowerShell脚本(How to run a PowerShell script within a Windows batch file)
    问题 如何在Windows批处理脚本的同一文件中嵌入PowerShell脚本? 我知道这种情况在其他情况下也是可能的: 使用sqlcmd SQL嵌入批处理脚本中,并在文件的开头巧妙地排列goto和注释在* nix环境中,您希望运行脚本的程序的名称在注释的第一行被注释掉了,例如, #!/usr/local/bin/python 。 可能没有办法做到这一点-在这种情况下,我将不得不从启动脚本中调用单独的PowerShell脚本。 我考虑过的一种可能的解决方案是回显PowerShell脚本,然后运行它。 不这样做的一个很好的理由是,尝试这样做的部分原因是要利用PowerShell环境的优势而不会遇到诸如转义符之类的麻烦。 我有一些不寻常的约束条件,想找到一个优雅的解决方案。 我怀疑这个问题可能是在诱使各种各样的回答:“为什么不尝试解决这个不同的问题呢?” 可以说这些是我的限制,对此表示遗憾。 有任何想法吗? 是否有巧妙的注释和转义字符的合适组合可以使我实现这一目标? 关于如何实现这一点的一些想法: 行尾的^符号是连续符号-就像Visual Basic中的下划线一样 “& &通常用于分隔命令echo Hello & echo World会在单独的行上产生两次回声 %0将为您提供当前正在运行的脚本 所以像这样的东西(如果我能使它工作)将是很好的: # & call powershell
  • 将多个值传递给单个PowerShell脚本参数(Passing multiple values to a single PowerShell script parameter)
    问题 我有一个脚本,可以在$ args中将服务器名称传递给该脚本。 这样,我可以使用foreach对此服务器进行处理: .\script.ps1 host1 host2 host3 foreach ($i in $args) { Do-Stuff $i } 我想添加一个名为vlan的命名可选参数。 我试过了: Param( [string]$vlan ) foreach ($i in $args) { Write-Host $i } Write-Host $vlan 如果您传递-vlan参数,则该方法-vlan但如果不这样做,则脚本会自动将最后一个服务器名称分配给$vlan 。 因此,如何将单个或多个参数以及可选的命名参数传递给PowerShell脚本? 理想情况下,以下是有效的示例: .\script.ps1 host1 .\script.ps1 host1 host2 host3 .\script.ps1 host1 host2 -vlan office 回答1 最简单的方法可能是使用两个参数:一个用于主机(可以是数组),另一个用于vlan。 param([String[]] $Hosts, [String] $VLAN) 代替 foreach ($i in $args) 您可以使用 foreach ($hostName in $Hosts) 如果只有一台主机
  • 从Python脚本运行PowerShell函数(Run PowerShell function from Python script)
    问题 我需要从Python脚本运行PowerShell函数。 .ps1和.py文件当前都位于同一目录中。 我要调用的函数在PowerShell脚本中。 我看到的大多数答案都是关于从Python运行整个PowerShell脚本的。 在这种情况下,我试图在Python脚本的PowerShell脚本中运行单个功能。 这是示例PowerShell脚本: # sample PowerShell Function hello { Write-Host "Hi from the hello function : )" } Function bye { Write-Host "Goodbye" } Write-Host "PowerShell sample says hello." 和Python脚本: import argparse import subprocess as sp parser = argparse.ArgumentParser(description='Sample call to PowerShell function from Python') parser.add_argument('--functionToCall', metavar='-f', default='hello', help='Specify function to run') args = parser