en un clic
windows-shell
Manage long-running background jobs and interactive workflows on Windows using PowerShell Jobs (Start-Job, Receive-Job) — the Windows equivalent of tmux sessions.
Menu
Manage long-running background jobs and interactive workflows on Windows using PowerShell Jobs (Start-Job, Receive-Job) — the Windows equivalent of tmux sessions.
Schedule reminders and recurring tasks.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Split memory system with USER.md for durable personal profile and MEMORY.md for token-budgeted operational context.
Search and install agent skills from ClawHub, the public skill registry.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Summarize or extract text/transcripts from URLs, podcasts, and local files (great fallback for “transcribe this YouTube/video”).
| name | windows-shell |
| description | Manage long-running background jobs and interactive workflows on Windows using PowerShell Jobs (Start-Job, Receive-Job) — the Windows equivalent of tmux sessions. |
| metadata | {"shibaclaw":{"emoji":"🪟","os":["windows"]}} |
Use PowerShell Jobs when you need to run tasks in the background, keep processes alive across multiple steps, or run several commands in parallel on Windows.
This skill is the Windows counterpart of the tmux skill (available on Linux/macOS).
# Start a background job and keep a reference
$job = Start-Job -Name "myTask" -ScriptBlock {
# Replace with the real command
python -u my_script.py
}
Write-Host "Job started: $($job.Id) ($($job.Name))"
# List all jobs
Get-Job
# Check a specific job
Get-Job -Name "myTask" | Select-Object Id, Name, State, HasMoreData
States: Running, Completed, Failed, Stopped.
# Read output without consuming it (Keep = $true)
Receive-Job -Name "myTask" -Keep
Remove
-Keeponly when you want to consume and discard the buffered output.
# Block until the job finishes (with timeout)
$job = Get-Job -Name "myTask"
$job | Wait-Job -Timeout 120 # seconds
if ($job.State -eq "Completed") {
Receive-Job $job
} else {
Write-Warning "Job did not finish in time. State: $($job.State)"
}
$jobs = @(
Start-Job -Name "task1" -ScriptBlock { python -u worker.py --id 1 },
Start-Job -Name "task2" -ScriptBlock { python -u worker.py --id 2 },
Start-Job -Name "task3" -ScriptBlock { python -u worker.py --id 3 }
)
# Wait for all
$jobs | Wait-Job
# Collect results
foreach ($j in $jobs) {
Write-Host "=== $($j.Name) ==="
Receive-Job $j
}
# Start server in background
$server = Start-Job -Name "devServer" -ScriptBlock {
Set-Location $using:PWD
python -m uvicorn app:app --reload --port 8000
}
# Poll until it is listening
for ($i = 0; $i -lt 30; $i++) {
Start-Sleep -Seconds 1
$out = Receive-Job $server -Keep
if ($out -match "Application startup complete") { break }
}
Write-Host "Server ready"
# Stop a specific job
Stop-Job -Name "myTask"
# Remove it from the session
Remove-Job -Name "myTask"
# Stop and remove all jobs at once
Get-Job | Stop-Job
Get-Job | Remove-Job
Use $using:varName to capture outer-scope variables inside -ScriptBlock:
$workDir = "C:\projects\myapp"
$port = 9000
$job = Start-Job -Name "app" -ScriptBlock {
Set-Location $using:workDir
python -m http.server $using:port
}
Start-Job -Name "bigJob" -ScriptBlock {
python -u long_script.py *>&1 | Tee-Object -FilePath "C:\Temp\job.log"
}
# Tail the log from the main shell
Get-Content "C:\Temp\job.log" -Wait -Tail 30
Start-Job over Start-Process -NoNewWindow when you need to capture stdout/stderr.-Keep on Receive-Job while the job is still running so you don't lose buffered output.Remove-Job to avoid memory leaks in long sessions.Start-Process powershell -ArgumentList "-NoExit", "-Command", "your-command".Set-Location $using:PWD or pass an explicit path.