如何让PowerShell作业支持同一用户跨窗口及跨设备访问?
Great question! Let’s split this into two common scenarios: accessing job results across different PowerShell windows on the same machine, and pulling them from another device entirely. And you’re right—writing results to a shared location is a super common solution for cross-device access, but there are tricks for same-machine access too.
Same Machine, Different PowerShell Windows
By default, background jobs created with Start-Job are tied to the specific PowerShell session (window) that started them. To share them across windows, you can use persistent PowerShell sessions (PSSessions) to host the job:
Create a named persistent session in your first window:
# Create a shared session that stays alive even if the original window closes $sharedSession = New-PSSession -Name "GlobalJobSession" -ComputerName localhostStart the job in this shared session:
# Run your job logic in the persistent session $job = Start-Job -Session $sharedSession -ScriptBlock { # Example job: Get top CPU-consuming processes Get-Process | Sort-Object CPU -Descending | Select-Object Name, CPU -First 10 }Access the job from another PowerShell window:
# Connect to the existing shared session $sharedSession = Get-PSSession -Name "GlobalJobSession" # Retrieve the job and its results $job = Get-Job -Session $sharedSession $results = Receive-Job -Job $job -Keep # Use -Keep to retain results in the job for future access
Note: If you close all windows, the PSSession will time out after 720 minutes by default. You can adjust this timeout with Set-PSSessionConfiguration if you need longer persistence.
Accessing Results From Another Device
For cross-device access, there’s no built-in way to directly "share" a PowerShell job across machines. Your hunch about writing results to a shared location is spot-on—this is the most reliable approach. Here are two clean implementations:
Option 1: Write results to a network share
Modify your job script to export results to a shared folder accessible by both devices. Using Export-Clixml preserves full PowerShell object properties, which is handy for complex data:
Start-Job -ScriptBlock { # Run your job logic $results = Get-EventLog -LogName System -Newest 100 # Export to a shared network path $results | Export-Clixml -Path "\\FileServer\SharedJobs\SystemLogResults.xml" }
Then, on the other device, retrieve the results:
$results = Import-Clixml -Path "\\FileServer\SharedJobs\SystemLogResults.xml"
Option 2: Use a centralized data store
For more robust tracking (e.g., multiple jobs, real-time updates), you could write results to a database (like SQL Server) or a cloud storage service. For example, using Azure Blob Storage:
# In the job script (after installing the Az.Storage module) $results = Get-Service | Where-Object Status -eq "Running" $results | ConvertTo-Json | Out-File "runningServices.json" Set-AzStorageBlobContent -Container "jobresults" -File "runningServices.json" -Context $storageContext
Key note: Ensure the account running the job has write permissions to the shared location, and the device retrieving results has read access.
Why Not Just Use Global Variables?
Global variables in PowerShell are only scoped to the current session—they won’t be visible in other windows or devices. So they’re not useful for this scenario.
内容的提问来源于stack exchange,提问作者leeand00

