powershell - 处理带有空格的名称

标签 powershell puppet powershell-5.0

我的 Puppet 代理是 Windows Server 2012。我正在尝试向 AD 用户授予数据库权限。如果我尝试将权限分配给名称中不包含任何空格的 AD 用户,则该脚本可以正常工作。早些时候,不带空格的用户名也不起作用,但是当我添加额外的斜杠('abc\\s_sql')时,它适用于该用户。对于带有空格的用户名,它根本不起作用,尽管 Puppet 显示它运行成功。

[root@pe-server] cat grant_read.pp
define db::grant_read (
    $grant_read_params
) {
    $grant_read_ps = $grant_read_params[grant_read_ps]
    $grant_read_sql = $grant_read_params[grant_read_sql]
    $read_user = $grant_read_params[read_user]
    $db_name = $grant_read_params[db_name]

    utils::powershell_script { "Grant read access to user $read_user on $db_name":
        script    => $grant_read_ps,
        parameter => "$grant_read_sql $read_user $db_name",
    }
}


[root@pe-server] cat site.pp
node 'pe-agent.abc.com' {
    $grant_read_params_Support_PROD = {
        'grant_read_ps'  => 'c:/db/grant_read.ps1',
        'grant_read_sql' => 'c:/db/grant_read.sql',
        #'read_user'     => 'abc\\s_sql',
        'read_user'      => 'abc\\APP Support_PROD',
        'db_name'        => 'ABC_MASTER',
    }

    db::grant_read { "Granting read access to tom on some db":
        grant_read_params => $grant_read_params_Support_PROD
    }
}


[root@pe-server] cat powershell_script.pp
define utils::powershell_script (String $script, String $parameter = '') {
    $powershell = 'C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile -NoLogo -NonInteractive'
    exec { "Running $script on agent with parameter $parameter":
            command => "$powershell -File $script $parameter",
            logoutput => 'on_failure',
            timeout   => 900,
    }
}

在 site.pp 文件参数和 grant_read.pp 文件中尝试了几种排列和组合,但似乎没有任何效果。

知道我该如何处理这个问题吗?

最佳答案

您需要将带有空格的参数用双引号括起来。单引号在这里不起作用,因为它们在执行 PowerShell 命令行的 Windows 环境中不是有效的引号字符。由于您不能使用单引号字符串(以免 Puppet 不会扩展变量),因此您必须使用反斜杠转义嵌套双引号(对于 Puppet)。

基本上是这样的:

"$grant_read_sql \"$read_user\" $db_name"

变成这样的字符串:

'c:/db/grant_read.sql "abc\APP Support_PROD" ABC_MASTER'

最后,当插入 PowerShell 命令行时,如下所示:

C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile -NoLogo -NonInteractive -File c:/db/grant_read.ps1 c:/db/grant_read.sql "abc\APP Support_PROD" ABC_MASTER

完全展开的命令行(见上文)必须采用允许直接从 CMD 或“运行”对话框运行的形式。这意味着如果任何其他标记(例如脚本路径)中包含空格,则该标记也需要用双引号引起来。

底线:您需要在参数两边加上双引号来执行 Windows 命令行,并使用反斜杠来转义 Puppet 双引号字符串内的嵌套双引号。

关于powershell - 处理带有空格的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42786651/

相关文章:

puppet - 为什么有Puppet 'Exec'和Puppet 'exec'两种类型

linux - Puppet 和 Facter 默认系统事实

PowerShell:抑制写入进度输出

powershell - 防止 Powershell 在文件末尾添加新行

regex - 从 PowerShell 中的正则表达式搜索获取捕获数组

powershell - 当将Select-Object与First参数一起使用时,OutVariable包含不正确的数据

powershell - Powershell v4 和 v5 之间 Join-Path cmdlet 的行为

powershell - 如何从值检索HashTable键?

ruby - 当参数需要资源引用时如何对 Puppet 类进行 rspec 测试

Powershell New-ScheduledTaskSettingsSet