在远程计算机上运行 Invoke 命令时如何将 Powershell 输出保存到本地计算机上的特定文件夹 [英] How to save Powershell output to specific folder on the local machine when running an Invoke command on remote machine

查看:59
本文介绍了在远程计算机上运行 Invoke 命令时如何将 Powershell 输出保存到本地计算机上的特定文件夹的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 powershell 从 LAN 上的所有计算机中提取基本计算机信息.这些计算机不是,也永远不会在域中.我在测试运行中取得了一些成功,将所有机器的输出保存到主机上的 c:\scripts 文件夹中.但是,我必须对每个 cmdlet 使用 Invoke-command,以便我可以将输出目标放在 {} 之外.

I am using powershell to pull basic computer information from all computers on a LAN. These computers are not, and will never be on, a domain. I have had some success in my test runs getting the output for all of the machines to save into the c:\scripts folder on the host machine. I am, however, having to use the Invoke-command for every cmdlet so that I can put the Output destination outside of the {}.

$computers = Get-Content -Path 'c:\scripts\livePCs.txt'

foreach ($computer in $computers) {
$username = '$computer\Administrator'
$password = Get-Content 'C:\scripts\encrypted_password.txt' | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PSCredential($username, $password)

# Local Mounted Shares Enumeration
Invoke-Command -Computername $computer -Credential $credential {Get-SmbMapping | Format-Table -AutoSize} | Out-File "c:\scripts\ComputerInformation\$computer.mountedshares.ps.txt"

# Local Shares Enumeration
Invoke-Command -Computername $computer -Credential $credential {Get-SmbShare | Format-Table -AutoSize} | Out-File "c:\scripts\ComputerInformation\$computer.localshares.ps.txt"

我不想这样做,当我必须使用 If/Else 语句时,它会变得有问题,因为我不能将目标放在大括号之外,我得到一个找不到文件的错误(因为它是试图保存在远程主机上).我尝试在下面使用共享,但现在我正在访问文件路径被拒绝错误.

I would prefer not to have to do this and it becomes problematic when I have to use If/Else statements, where, because I cannot put the destination outside of braces, I get a file cannot be found error (since it is trying to save on the remote host). I tried using a share instead, in the below but now am getting an access to the file path is denied error.

Invoke-Command -Computername $computer -Credential $credential {
$computername = hostname.exe
If ($PSVersionTable.PSVersion -ge '4.0') {
    If (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
        Get-WindowsOptionalFeature -Online -FeatureName *Hyper-V* | Format-Table -AutoSize | Out-File -Width 1024 "\\$env:computername\scripts\ComputerInformation\$computername.hyperv.admin.ps.txt"
        if (Get-Command Get-VM -ErrorAction SilentlyContinue) {
            Get-VM | Format-Table -AutoSize | Out-File -Width 1024 -Append "c:\scripts\ComputerInformation\$computername.hyperv.admin.ps.txt"
            Get-VM | Get-VMNetworkAdapter | Format-Table -AutoSize | Out-File -Width 1024 -Append "c:\scripts\ComputerInformation\$computername.hyperv.admin.ps.txt"
        } else {
            Write-Host -ForegroundColor Yellow "         Hyper-V feature not installed on this host"
        }
    } else {
        Write-Host -ForegroundColor Red "         You do not have required permissions to complete this task ..."
    }
} else {
    Write-Host -ForegroundColor Red "         This commands requires at least PowerShell 4.0 ... manual inspection is required"
}

我如何使用 Invoke-Command 在远程机器上运行这个,但将输出保存到本地 c:\scripts 文件夹?

How do I run this one a remote machine using Invoke-Command but save the output to the local c:\scripts folder?

推荐答案

如果目标是让您自己选择输出到调用系统上的多个文件,您可以使用哈希表 ($results) 在您的脚本块中以存储您的结果.然后在脚本块的末尾输出该表.根据这些键/值,您可以输出到文件.

If the goal is to give yourself the option to output to multiple files on the calling system, you could use a hash table ($results) inside of your script block to store your results. Then output that table at the end of your script block. Based on those keys/values, you could output to file.

foreach ($computer in $computers) {
    $Output = Invoke-Command -Computername $computer -Credential $credential {
    $results = @{}
    $computername = hostname.exe
    If ($PSVersionTable.PSVersion -ge '4.0') {
        If (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
            $HyperV = Get-WindowsOptionalFeature -Online -FeatureName *Hyper-V* | Format-Table -AutoSize
            if (Get-Command Get-VM -ErrorAction SilentlyContinue) {
                $VMInfo = Get-VM | Format-Table -AutoSize 
                $VMNic = Get-VM | Get-VMNetworkAdapter | Format-Table -AutoSize
            } else {
                Write-Host -ForegroundColor Yellow "         Hyper-V feature not installed on this host"
            }
        } else {
            Write-Host -ForegroundColor Red "         You do not have required permissions to complete this task ..."
        }
    } else {
        Write-Host -ForegroundColor Red "         This commands requires at least PowerShell 4.0 ... manual inspection is required"
    }
    $results.Add('HyperV',$HyperV)
    $results.Add('VMInfo',$VMInfo)
    $results.Add('VMNic',$VMNic)
    $results
    }

    $Output.HyperV | Out-File -Width 1024 "c:\scripts\ComputerInformation\$computer.hyperv.txt"
    $Output.VMInfo | Out-File -Width 1024 "c:\scripts\ComputerInformation\$computer.VMInfo.txt"
    $Output.VMNic | Out-File -Width 1024 "c:\scripts\ComputerInformation\$computer.VMNic.txt"
}


如果目标是简单地将所有数据输出到一个位置,您可以简单地将您的 Invoke-Command 结果存储到一个变量中.然后将变量内容写入文件:


If the goal is to simply output all data to one location, you can simply store your Invoke-Command result into a variable. Then write the variable contents to file:

$Output = Invoke-Command -Computername $computer -Scriptblock { # my code runs here }
$Output | Out-File "C:\Folder\$computer.txt"


如果您希望在变量中捕获 Write-Host 输出,则需要将信息流发送到成功流 ( { script block } 6>&1 }


If you are looking to capture Write-Host output in a variable, you will need to send the information stream to the success stream ( { script block } 6>&1 }

这篇关于在远程计算机上运行 Invoke 命令时如何将 Powershell 输出保存到本地计算机上的特定文件夹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆