使用'打开多个远程会话;mstsc&x27;在powershell脚本中
我正在尝试编写一个powershell脚本,为保存在文本文件中的每个计算机名打开远程桌面连接。当我运行脚本时,它只连接到列表中的第一台计算机并输出到控制台:使用'打开多个远程会话;mstsc&x27;在powershell脚本中,powershell,remote-desktop,powershell-remoting,mstsc,Powershell,Remote Desktop,Powershell Remoting,Mstsc,我正在尝试编写一个powershell脚本,为保存在文本文件中的每个计算机名打开远程桌面连接。当我运行脚本时,它只连接到列表中的第一台计算机并输出到控制台:CMDKEY:Credential added successfully一次(不是每台计算机一次)mstcs似乎在执行后终止该进程,我不确定我是否以正确的方式添加了凭据。谁能给我指出正确的方向吗 以下是我试图弄清楚发生了什么的一些测试: 在mstsc之后打印。不打印。这个过程似乎在之后终止 mstcs被调用。这似乎是问题的症结所在 cmdk
CMDKEY:Credential added successfully
一次(不是每台计算机一次)mstcs
似乎在执行后终止该进程,我不确定我是否以正确的方式添加了凭据。谁能给我指出正确的方向吗
以下是我试图弄清楚发生了什么的一些测试:
- 在
之后打印。不打印。这个过程似乎在之后终止mstsc
被调用。这似乎是问题的症结所在mstcs
显示我存储的所有凭据及其目标。输出不包括文本文件中定义的所有目标。即使我将cmdkey/list
注释掉,那么mstsc
似乎只在第一行执行,缺乏更多控制台输出和cmdkey/add:$MachineName/user:$user/pass:$Password
没有产生预期目标就是证明。此外,我在cmdkey/list
这一行之后添加了一个print语句,它为每一行打印,因此它在运行后不会终止(我已经知道了这一点,因为cmdkey
在这一行之后执行,但它没有被注释掉)mstcs
编辑:我还尝试用
启动流程-文件路径“$env:windir\system32\mstsc.exe”-ArgumentList”/v:$MachineName”-等待替换mstsc/v:$MachineName
。结果是打开会话,然后脚本不会在控制台中完成,但不会发生任何其他情况。此行为是由于您使用了输出字符串造成的
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
,循环将正常运行删除| Out String
-它将您刚从文件中读取的单个行转换为单个多行字符串,这就是循环在运行后退出的原因once@mathiasR.Jessen真管用!我之前补充说,没有很好的理解。。。回想起来,这更多是为了调试目的。仍在试图解释它为什么会这样做。感谢您的输入。我最初的评论是在您添加关于多行字符串的解释之前。这说明了原因。再次感谢。有趣的是,我在for循环中打印出了“每一行”(事实证明,只有一行)来尝试和调试东西。它似乎打印了每一行(因为所有行都已打印),但我没有意识到它是一个多行字符串。@更不明智的是,我倾向于总是在调试消息中的值周围添加一些限定符,例如,Write Host“Machine Name is'$MachineName'
而不是普通的Write Host$MachineName
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