我希望从脚本运行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在这个飞地被阻止。
答案 0 :(得分:3)
我的第一个猜测是你的CSV文件中有“隐形”空格。例如,它们可能是CSV中服务器名称之后的尾随空格,当然您的眼睛看不到。您可以通过修复CSV文件或在导入的字符串上使用.Trim()
来解决此问题 - 即$_.Name.Trim()
如果情况并非如此,或者不是唯一的问题,那么这就是我遇到过的问题。当我有复杂的字符串,如你想要的net.exe
参数时,我喜欢采取预防措施,并在定义字符串时获得额外的迂腐,而不是依靠PowerShell自动猜测字符串的开始和结束位置。
因此,不是在net.exe
命令行上内联烘焙参数,而是先将它们手工制作成变量,如此
$args = '\\' + $_.name + '/user:' + $_.name + '\Administrator' + $_.pass
如果你write-Host
,你会发现它已经不再有你的流氓空间了。事实上,您可能会注意到它已经不再具有足够的空间,因此您必须明确了解它们所属的位置。例如,上面的行没有在\\servername
和/user
之间或者在用户名和密码之间放置适当的空格,所以你必须重新添加该空格,就像这样。
$args = '\\' + $_.name + ' /user:' + $_.name + '\Administrator ' + $_.pass
注意显式空格。
答案 1 :(得分: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”和“\”在同一个变量中,它会中断。