Batch file 在批处理文件中运行powershell命令

Batch file 在批处理文件中运行powershell命令,batch-file,powershell,Batch File,Powershell,我正在尝试使用新的ADGroup创建一些Active Directory安全组,但我需要能够在批处理文件中执行这些安全组。我的目标是让脚本提示运行它的用户输入OU和在组名前面使用的分支前缀 我刚开始使用Powershell,所以我还没有100%确定何时使用不同的方括号和引号,我怀疑这是我的问题 这是我的原始代码: SET /P OU=Enter OU: Set /P Prefix=Enter Prefix: Powershell New-ADGroup -Name “%Prefix%-OWA T

我正在尝试使用新的ADGroup创建一些Active Directory安全组,但我需要能够在批处理文件中执行这些安全组。我的目标是让脚本提示运行它的用户输入OU和在组名前面使用的分支前缀

我刚开始使用Powershell,所以我还没有100%确定何时使用不同的方括号和引号,我怀疑这是我的问题

这是我的原始代码:

SET /P OU=Enter OU:
Set /P Prefix=Enter Prefix:
Powershell New-ADGroup -Name “%Prefix%-OWA Test” -SamAccountName “%Prefix%-OWA Test” -GroupCategory Security -GroupScope Global -path "OU=Groups,OU=%OU%,OU=Test1,DC=Test2,DC=Test3,DC=Test4,DC=com”
我能够在PowerShell中执行该命令,因此批处理文件中的某些内容导致了我的问题。我还尝试从等式中删除变量,并执行以下操作:

powershell New-ADGroup -Name "ORF-OWA Test" -SamAccountName "ORF-OWA Test" -GroupCategory Security -GroupScope Global -path "OU=Groups,OU=Branch1,OU=Test1,DC=Test2,DC=Test3,DC=Test4,DC=com”
在这两种情况下,我都会收到以下错误:

New-ADGroup : Cannot convert 'System.Object[]' to the type 'System.String'
required by parameter 'Path'. Specified method is not supported.
At line:1 char:110
+ ... e Global -path OU=Groups,OU=Branch1
,OU=Test,DC=Test1,DC=Test2,DC=Test3,DC=com -Des ...
+                    ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-ADGroup], ParameterBin
   dingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.ActiveDirectory.
   Management.Commands.NewADGroup 
我读这篇文章的方式是“Path”参数有问题,但我只是不确定为什么它在PowerShell中成功,而不是从cmd提示符或bat文件中成功


如果您有任何建议,我们将不胜感激。

在批处理文件中使用PowerShell时,您必须记住该行将被解析两次。首先是CMD,然后是PowerShell。我做这件事的个人规则是

  • 在批处理或命令行中使用PowerShell时,请使用单引号
  • 如果包含特殊字符,请将整个powershell命令用双引号括起来
  • 示例:单一报价:

    Powershell New-ADGroup -Name '%Prefix%-OWA Test' -SamAccountName '%Prefix%-OWA Test' -GroupCategory Security -GroupScope Global -path 'OU=Groups,OU=%OU%,OU=Test1,DC=Test2,DC=Test3,DC=Test4,DC=com'
    
    PowerShell -Command "&{New-ADGroup -Name '%Prefix%-OWA Test' -SamAccountName '%Prefix%-OWA Test' -GroupCategory Security -GroupScope Global -path 'OU=Groups,OU=%OU%,OU=Test1,DC=Test2,DC=Test3,DC=Test4,DC=com'}"
    
    示例:显式命令、范围和双引号:

    Powershell New-ADGroup -Name '%Prefix%-OWA Test' -SamAccountName '%Prefix%-OWA Test' -GroupCategory Security -GroupScope Global -path 'OU=Groups,OU=%OU%,OU=Test1,DC=Test2,DC=Test3,DC=Test4,DC=com'
    
    PowerShell -Command "&{New-ADGroup -Name '%Prefix%-OWA Test' -SamAccountName '%Prefix%-OWA Test' -GroupCategory Security -GroupScope Global -path 'OU=Groups,OU=%OU%,OU=Test1,DC=Test2,DC=Test3,DC=Test4,DC=com'}"
    
    我没有时间测试这些功能是否有效,但尝试了一下对于工作命令的说明(注意,它还需要两个输入变量),下面是我使用的批处理powershell命令之一:

    PowerShell -Command "&{$nlm = [Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]'{DCB00C01-570F-4A9B-8D69-199FDBA5723B}')); $connections = $nlm.getnetworkconnections(); $connections | foreach { if ($_.GetNetwork().GetCategory() -eq %Filter%) { $_.GetNetwork().SetCategory(%Category%); } }; }"
    

    这很有效。谢谢你,大卫!两个后续问题。你说你的规则是对CMD使用双引号,那么为什么第一个例子只有单引号呢?我的假设是,既然新的广告组是由PowerShell发布的,那么您是从命令行运行它的,对吗?在第二个示例中,您使用了-命令。我在测试中反复使用了这个,不管有没有它,我都会得到同样的错误。你什么时候需要用这个?@Yemyself很乐意帮忙。当我说PowerShell使用单引号,CMD使用双引号时,这意味着在批处理或命令行中使用的PowerShell语句中,只使用单引号。我已经更新了答案,使之更加清晰。仅执行命令时,不需要使用
    -Command
    标志,因为它是隐含的,但在指定其他选项时最好是显式的。在命令提示符下,键入
    powershell/?
    ,以获得选项、详细信息和示例的良好列表。明白。再次感谢。