从计划任务中检索数据

时间:2016-12-22 10:14:40

标签: powershell scheduled-tasks

我们正在尝试收集登录到Windows 7客户端的用户的映射驱动器。为此,我们需要创建一个计划任务并让它以该用户身份运行。这工作正常,但问题是从计划任务中检索数据。

代码

   Invoke-Command -ScriptBlock {
    $User = 'John'
    $Script = 'C:\Users\' + $User + '\AppData\Local\Temp' + '\Script.ps1'
    $File = 'C:\Users\' + $User + '\AppData\Local\Temp' + '\Data.txt'


    $Code = {
        $User = 'John'
        $File = 'C:\Users\' + $User + '\AppData\Local\Temp' + '\Data.txt'
        Get-WmiObject -Class win32_mappedlogicaldisk | Select-Object Name, ProviderName | 
            Export-Csv $File -Encoding UTF8 -NoTypeInformation
    }

    $Code | Set-Content $Script -Encoding utf8

    schtasks /create /RL HIGHEST /SC ONCE /ST 23:00 /TN "Test" /TR "powershell.exe -ExecutionPolicy Bypass -File '$Script'" /RU "$env:USERDNSDOMAIN\$User"
    schtasks /run /TN "Test"
    schtasks /delete /F /TN "Test"

    for ($i = 0; $i -le 5; $i++) {
        if (Test-Path $File) {
            Import-Csv $File
            Break
        }
        else {
            Start-Sleep -Seconds 1
        }
    }

} -ComputerName $Computer

问题似乎是从用户Data.txt文件夹中检索$ENV:Temp。这似乎是一个重复的事情,有没有更简洁的方法这样做?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

由于它是一个非交互式脚本,我使用相同的方法,只需缩短版本的等待循环:

while (!(Test-Path $File)) { Start-Sleep 1 }

Import-Csv $File

更优雅,但基本相同。

答案 1 :(得分:0)

我会选择以下内容作为Login Script

$File = "\\server\share\$($env:username).csv"

if (!(Test-Path $File)) {
    Get-WmiObject -Class win32_mappedlogicaldisk | Select-Object Name, ProviderName | Export-Csv $File -Encoding UTF8 -NoTypeInformation
}

由于它是一个登录脚本,它将在用户上下文中运行(并且仅获取其映射的驱动器),并将文件写入中央共享而不是本地驱动器,因此您可以更轻松地获取数据。 / p>

如果您需要其他示例,可以根据需要移动/删除文件,或者删除Test-Path检查并将-Append添加到Export-Csv,它会将驱动器记录到文件中在每次登录时。