1

我正在寻找从脚本运行 net.exe,但我遇到了一些空格问题。这是代码...

# Variables
$gssservers = Import-Csv "gssservers.csv"

$gssservers | Where-Object {$_.Tier -match "DB"} | Foreach-Object {
    net.exe use "\\"$_.Name '/user:'$_.Name'\Administrator' $_.Pass
    $sqlcheck = sc.exe \\$gsssql[1] query "WUAUSERV"
    }

当我将第 5 行设置为 Write-Host 时,我看到在任何我有引号的地方添加了空格,这破坏了 net.exe 命令。如何删除这些空格?

对于任何质疑我是如何做到这一点的人,net.exe 命令是我可以访问这些机器的唯一方法,因为 WMI 被阻止在这个 enclave 中。

4

2 回答 2

3

我的第一个猜测是您的 CSV 文件中有“不可见”的空格。例如,它们可能是 CSV 中您的服务器名称后面的尾随空格,您的眼睛当然看不到。您可以通过修复 CSV 文件或.Trim()在导入的字符串上使用来修复它——即$_.Name.Trim()

如果不是这种情况,或者不是唯一的问题,那么这就是我遇到的问题。当我有像您想要的net.exe参数这样的复杂字符串时,我喜欢采取预防措施并在定义字符串时获得额外的迂腐,而不是依赖 PowerShell 自动猜测字符串开始和结束的确切位置。

因此,与其在命令行中内联烘焙参数,不如net.exe先将它们手工制作成一个变量,就像这样

$args = '\\' + $_.name + '/user:' + $_.name + '\Administrator' + $_.pass

如果你write-Host这样做了,你会发现它不再有你的流氓空间。实际上,您可能会注意到它不再有足够的空间,因此您必须明确说明它们的所属位置。例如,上面的行没有在\\servernameand/user之间或用户名和密码之间放置适当的空格,因此您必须重新添加该空格,就像这样。

$args = '\\' + $_.name + ' /user:' + $_.name + '\Administrator ' + $_.pass

注意显式空格。

于 2013-10-10T18:46:46.810 回答
0

我终于使用@EdgeVB 的解决方案自己解决了这个问题。代码最终是这样的......

# Variables
$gssservers = Import-Csv "gssservers.csv"

$gssservers | Where-Object {$_.Tier -match "DB"} | Foreach-Object {
    $cmd1 = 'use'
    $arg1 = '\\' + $_.Name
    $arg2 = ' /user:' + $_.Name + '\Administrator '
    & net.exe $cmd1 $arg1 $arg2 $_Pass
    $cmd2 = 'query'
    $svc1 = 'mssqlserver'
    & sc.exe $arg1 $cmd2 $svc1 | Write-Host
    }

您不仅需要预先烘焙变量,而且它们也不能跨越某些阈值(例如,如果“use”和“\”在同一个变量中,它会中断。

于 2013-10-11T14:38:28.347 回答