使用'打开多个远程会话;mstsc&x27;在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

我正在尝试编写一个powershell脚本,为保存在文本文件中的每个计算机名打开远程桌面连接。当我运行脚本时,它只连接到列表中的第一台计算机并输出到控制台:
CMDKEY:Credential added successfully
一次(不是每台计算机一次)
mstcs
似乎在执行后终止该进程,我不确定我是否以正确的方式添加了凭据。谁能给我指出正确的方向吗

以下是我试图弄清楚发生了什么的一些测试:

  • mstsc
    之后打印。不打印。这个过程似乎在之后终止
    mstcs
    被调用。这似乎是问题的症结所在
  • cmdkey/list
    显示我存储的所有凭据及其目标。输出不包括文本文件中定义的所有目标。即使我将
    mstsc
    注释掉,那么
    cmdkey/add:$MachineName/user:$user/pass:$Password
    似乎只在第一行执行,缺乏更多控制台输出和
    cmdkey/list
    没有产生预期目标就是证明。此外,我在
    cmdkey
    这一行之后添加了一个print语句,它为每一行打印,因此它在运行后不会终止(我已经知道了这一点,因为
    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