我正在尝试编写一个powershell脚本,该脚本为保存在文本文件中的每个机器名称打开一个远程桌面连接。当我运行脚本时,它只连接到列表中的第一台机器,并输出到控制台:CMDKEY: Credential added successfully一次(不是每台机器一次)。mstcs似乎在执行之后终止了进程,我不确定我是否以正确的方式添加了凭据。谁能给我指明正确的方向?
下面是一些我试图弄清楚发生了什么的测试:
mstsc之后。不会打印。进程似乎在调用mstcs之后终止。这似乎是issue.cmdkey /list的关键所在,它显示了我存储的所有凭据及其目标。输出不包括文本文件中定义的所有目标。即使我注释掉了mstsc,那么cmdkey /add:$MachineName /user:$User /pass:$Password似乎只执行第一行,这可以从缺少更多的控制台输出和cmdkey /list没有产生预期的目标来证明。此外,我在这个cmdkey行之后添加了一个print语句,它为每一行打印,所以它不会在运行后终止(我已经知道了,因为mstcs在没有注释掉的情况下会在该行之后执行)。# Read from file
$Lines = Get-Content -Path .\machines.txt | Out-String
# For each machine ...
foreach($Line in $Lines){
# Split line, save name and domain
$Tokens = $Line.Split(".")
$MachineName = $Tokens[0]
$Domain = $Tokens[1]
$User = "someDomain\someUsername"
$Password="somePassword"
# Switch username if someOtherDomain
if ($Domain -eq "someOtherDomain"){
$User = "someOtherDomain\someOtherUsername"
}
#set credentials and open connection
cmdkey /add:$MachineName /user:$User /pass:$Password
mstsc /v:$MachineName /console
}编辑:我也尝试过用Start-Process -FilePath "$env:windir\system32\mstsc.exe" -ArgumentList "/v:$MachineName" -Wait代替mstsc /v:$MachineName。结果是打开会话,然后脚本在控制台中没有完成,但是没有发生任何额外的事情。
发布于 2020-11-19 23:42:17
这种行为是由您使用Out-String引起的。
Get-Content输出多个字符串,文件中每一行一个--但是Out-String将它们拼接回一个多行字符串中:
PS C:\> $machines = Get-Content machines.txt
PS C:\> $machines.GetType().Name # definitely an array
Object[]
PS C:\> $machines.Count # multiple strings in there
4
PS C:\> $machines = Get-Content machines.txt | Out-String
PS C:\> $machines.GetType().Name # now it's just a single string
String因此,您的foreach(){}循环只运行一次,$MachineName的值不再是一台机器的名称,而是一个多行字符串,同时包含所有这些字符串--这可能就是为什么mstsc立即退出的原因:)
从第一行中删除|Out-String,循环就可以工作了。
https://stackoverflow.com/questions/64921047
复制相似问题