WSL-Windows脚本运行器

WSL-Windows脚本运行器是一种桥接服务,允许WSL环境自动在Windows主机上执行Windows脚本(.bat、.ps1),并提供完整的日志记录和监控功能。适用于AI助手、自动化工作流和测试等场景。

  • by dbbuilder
  • PowerShell
  • 本地部署
  • 更新于
在 GitHub 查看 dbbuilder/wsl-windows-script-runner

使用说明

WSL Windows脚本运行程序

一种桥接服务,允许WSL环境在Windows主机上自动执行Windows脚本(.bat、.ps1),并进行完整的日志记录和监控。

概述

此工具解决了从WSL(Linux的Windows子系统)运行Windows本机脚本的问题。它监视队列文件夹中的新脚本,在Windows上自动执行它们,捕获完整的输出日志,并组织完成的脚本。

非常适合:在WSL中运行的AI助手(如Claude)需要执行Windows命令、自动化工作流、测试或WSL需要触发Windows端操作的任何场景。

特性

  • 自动执行:放置在队列文件夹中的脚本会立即执行
  • 完整日志记录:使用时间戳完成stdout/stderr捕获
  • 文件稳定性检测:执行前等待文件完全写入
  • 有组织的产出:自动分类到已完成/存档文件夹
  • 退出代码跟踪:通过适当的日志记录进行成功/失败检测
  • 多种脚本类型:支持.ps1、.bat和.cmd文件
  • WSL集成:用于提交的易于使用的bash辅助脚本
  • 服务模式:作为Windows计划任务运行(从启动时开始)
  • 错误恢复:故障时自动重启
  • MCP集成:用于本机Claude Code集成的可选MCP服务器

集成选项

选项1:MCP服务器(建议用于Claude代码)⭐

MCP(模型上下文协议)服务器提供与专用工具的本地Claude集成:

  • windows_execute -通过一次工具调用执行PowerShell命令
  • windows_get_status -检查转轮状态
  • windows_list_logs -查看最近的日志
  • windows_read_log -读取特定日志文件

设置:

cd /mnt/d/Dev2/wsl-windows-script-runner/mcp-server
./setup.sh
./configure-claude.sh

看 mcp服务器/README.md 获取完整文档。

Claude中的用法:

Use windows_execute to get the Windows computer name
Use windows_execute to list all running Chrome processes
Check the Windows script runner status

选项2:Bash助手脚本

使用 wsl-submit.sh 直接使用辅助脚本:

/mnt/d/Dev2/wsl-windows-script-runner/wsl-submit.sh script.ps1

此选项需要更多的手动步骤,但无需MCP设置即可工作。

建筑

WSL Environment                    Windows Host
┌─────────────────┐               ┌──────────────────────┐
│                 │               │                      │
│  Claude/User    │               │  Script Watcher      │
│      ↓          │               │  (Scheduled Task)    │
│  wsl-submit.sh  │───────┐       │         ↓            │
│      ↓          │       │       │  FileSystemWatcher   │
│  Copy to queue  │       │       │         ↓            │
│                 │       │       │  Execute Script      │
└─────────────────┘       │       │         ↓            │
                          │       │  Capture Logs        │
   Shared Folder          │       │         ↓            │
┌─────────────────────────┼───────┼──────────────────────┐
│ /mnt/d/Dev2/wsl-...     │       │  D:\Dev2\wsl-...     │
│                         │       │                      │
│  queue/ ←───────────────┘       │  ← Monitor           │
│  logs/                          │  → Write             │
│  completed/                     │  → Move (success)    │
│  archive/                       │  → Move (failure)    │
└─────────────────────────────────┴──────────────────────┘

目录结构

wsl-windows-script-runner/
├── queue/                      # Drop scripts here (monitored)
├── logs/                       # Execution logs with timestamps
├── completed/                  # Successfully executed scripts
├── archive/                    # Failed scripts
├── ScriptWatcher.ps1           # Main file watcher service
├── Install-ScriptWatcher.ps1   # Installation script
├── Uninstall-ScriptWatcher.ps1 # Removal script
├── Get-WatcherStatus.ps1       # Status checker
├── wsl-submit.sh               # WSL helper script
└── README.md                   # This file

安装

步骤1:安装计划任务(Windows,作为管理员)

# Open PowerShell as Administrator
cd D:\Dev2\wsl-windows-script-runner

# Install the service
.\Install-ScriptWatcher.ps1

这将:

  • 创建一个名为“WSL Windows ScriptRunner”的计划任务
  • 将其配置为在系统启动时运行
  • 以SYSTEM权限运行以获得最大兼容性
  • 设置故障时自动重启

步骤2:验证安装

# Check status (Windows)
.\Get-WatcherStatus.ps1

# Or from WSL
/mnt/d/Dev2/wsl-windows-script-runner/wsl-submit.sh --status

步骤3:可选-将WSL助手添加到PATH

# Add to your ~/.bashrc or ~/.zshrc
echo 'alias wsl-run="/mnt/d/Dev2/wsl-windows-script-runner/wsl-submit.sh"' >> ~/.bashrc
source ~/.bashrc

# Now you can use:
wsl-run script.ps1
wsl-run --status
wsl-run --logs

用法

来自WSL

提交脚本以供执行

# Using the helper script
/mnt/d/Dev2/wsl-windows-script-runner/wsl-submit.sh myscript.ps1

# Or if you added the alias
wsl-run myscript.ps1

# Or copy directly
cp myscript.bat /mnt/d/Dev2/wsl-windows-script-runner/queue/

检查状态

wsl-run --status

查看日志

# List recent logs
wsl-run --logs

# Filter logs
wsl-run --logs backup

# Tail a specific log
wsl-run --tail backup_20250115_143022.log

实时观察队列

wsl-run --watch

从Windows

手动执行(测试)

# Run the watcher manually (for testing)
.\ScriptWatcher.ps1

# Press Ctrl+C to stop

检查状态

.\Get-WatcherStatus.ps1

# Or check the scheduled task
Get-ScheduledTask -TaskName "WSL-Windows-ScriptRunner"

启动/停止服务

# Start
Start-ScheduledTask -TaskName "WSL-Windows-ScriptRunner"

# Stop
Stop-ScheduledTask -TaskName "WSL-Windows-ScriptRunner"

# Restart
Stop-ScheduledTask -TaskName "WSL-Windows-ScriptRunner"
Start-ScheduledTask -TaskName "WSL-Windows-ScriptRunner"

例子

示例1:简单PowerShell脚本

来自WSL:

# Create a test script
cat > /tmp/test.ps1 << 'EOF'
Write-Host "Hello from Windows!"
Write-Host "Current User: $env:USERNAME"
Write-Host "Computer: $env:COMPUTERNAME"
Get-Date
EOF

# Submit it
wsl-run /tmp/test.ps1

# View the log
wsl-run --logs test

日志输出: logs/test_20250115_143022.log

示例2:带有错误处理的批处理脚本

来自WSL:

cat > /tmp/backup.bat << 'EOF'
@echo off
echo Starting backup...
echo Timestamp: %DATE% %TIME%

REM This will fail - demonstrates error logging
copy "C:\NonExistent\file.txt" "C:\Backup\" 2>&1

echo Backup process completed
EOF

wsl-run /tmp/backup.bat

# Check the archive (failed scripts)
ls /mnt/d/Dev2/wsl-windows-script-runner/archive/

示例3:Claude代码集成

当Claude需要从WSL运行Windows命令时:

# Claude creates a script
cat > /tmp/windows-task.ps1 << 'EOF'
# Install a Windows application
winget install --id Microsoft.PowerToys --silent

# Check if installation succeeded
if ($LASTEXITCODE -eq 0) {
    Write-Host "Installation successful"
} else {
    Write-Error "Installation failed with code: $LASTEXITCODE"
    exit $LASTEXITCODE
}
EOF

# Submit for execution
/mnt/d/Dev2/wsl-windows-script-runner/wsl-submit.sh /tmp/windows-task.ps1

# Wait and check the log
sleep 5
latest_log=$(ls -t /mnt/d/Dev2/wsl-windows-script-runner/logs/*.log | head -1)
cat "$latest_log"

日志格式

每次执行都会创建一个带时间戳的日志文件,其中包含:

========================================
Script Execution Log
========================================
Script: D:\Dev2\wsl-windows-script-runner\queue\test.ps1
Started: 2025-01-15 14:30:22
Host: DESKTOP-ABC123
User: SYSTEM
Working Directory: D:\Dev2\wsl-windows-script-runner
========================================

--- Standard Output ---
Hello from Windows!
Current User: SYSTEM
Computer: DESKTOP-ABC123
Wednesday, January 15, 2025 2:30:22 PM

--- Standard Error ---

========================================
Execution Summary
========================================
Exit Code: 0
Completed: 2025-01-15 14:30:23
Duration: 00:00:01.1234567
Status: SUCCESS
========================================

故障排除

任务未运行

# Check task status
Get-ScheduledTask -TaskName "WSL-Windows-ScriptRunner" | Format-List *

# Check last run result
Get-ScheduledTaskInfo -TaskName "WSL-Windows-ScriptRunner"

# View task history in Event Viewer
# Event Viewer → Task Scheduler → Task Scheduler Library

脚本未执行

  1. 检查任务是否正在运行:

    Get-ScheduledTask -TaskName "WSL-Windows-ScriptRunner" | Select State
    
  2. 手动运行监视器以查看错误:

    .\ScriptWatcher.ps1
    
  3. 检查文件权限:

    ls -l /mnt/d/Dev2/wsl-windows-script-runner/queue/
    

脚本卡在队列中

  • 文件可能仍被锁定(正在写入)
  • 检查监视器是否正在运行: Get-WatcherStatus.ps1
  • 检查文件扩展名是否为.ps1、.bat或.cmd
  • 尝试重新启动计划任务

未创建日志

  • 检查日志目录是否存在以及是否可写
  • 跑 Get-WatcherStatus.ps1 验证路径
  • 检查任务计划程序是否存在执行错误
  • 验证SYSTEM帐户是否具有写入权限

高级配置

自定义路径

# Install with custom paths
.\Install-ScriptWatcher.ps1 -TaskName "MyScriptRunner"

# Run watcher with custom paths
.\ScriptWatcher.ps1 `
    -QueuePath "C:\CustomQueue" `
    -LogPath "C:\CustomLogs" `
    -CompletedPath "C:\CustomCompleted" `
    -ArchivePath "C:\CustomArchive"

文件稳定性延迟

如果脚本很大,需要时间编写:

.\ScriptWatcher.ps1 -FileStabilityDelayMs 5000  # Wait 5 seconds

执行策略

如果遇到执行策略错误:

# Check current policy
Get-ExecutionPolicy

# Set to allow local scripts (as Administrator)
Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy RemoteSigned -Force

安全考虑

  • 作为系统运行:计划任务以SYSTEM权限运行,以实现最大兼容性
  • 无认证:将执行放置在队列文件夹中的任何文件
  • 代码执行:脚本具有完全的系统访问权限-仅在受信任的环境中使用
  • 网络接入:脚本可以访问网络资源
  • 文件权限:确保队列文件夹具有适合您的安全要求的ACL

推荐:仅在开发/测试环境中或在您信任所有用户都可以访问队列文件夹的系统上使用此工具。

卸载

# Open PowerShell as Administrator
cd D:\Dev2\wsl-windows-script-runner

# Remove the scheduled task
.\Uninstall-ScriptWatcher.ps1

# Optionally, delete the entire directory
# cd ..
# Remove-Item -Recurse -Force wsl-windows-script-runner

与Claude Code集成

最佳选择:MCP服务器(推荐)⭐

安装MCP服务器以实现无缝集成:

cd /mnt/d/Dev2/wsl-windows-script-runner/mcp-server
./setup.sh
./configure-claude.sh

然后简单地问克劳德:

  • “使用windows_enxecute检查windows磁盘空间”
  • “使用Windows_enxecute获取Windows版本”
  • “检查Windows脚本运行程序状态”

看 mcp服务器/README.md 了解详情。

替代方案:手动命令

添加到您的 ~/.claude/CLAUDE.md:

## WSL-Windows Script Runner

When you need to execute Windows-native commands from WSL:

1. Create a PowerShell or batch script with the required commands
2. Submit using: `/mnt/d/Dev2/wsl-windows-script-runner/wsl-submit.sh script.ps1`
3. Check logs in: `/mnt/d/Dev2/wsl-windows-script-runner/logs/`

Helper alias: `wsl-run <script>`

技术细节

  • 文件监视器:用途。NET FileSystemWatcher,用于高效监控
  • 进程执行:生成单独的流程来捕获输出
  • 退出代码:正确捕获并记录进程退出代码
  • 文件锁定:实现重试逻辑以确保文件完全写入
  • 编码:日志文件的UTF-8编码
  • 重启策略:失败时自动重启(3次重试,间隔1分钟)

许可证

这是免费且无阻碍的软件,已发布到公共领域。

贡献

您可以随时提交问题、分叉存储库,并为任何改进创建pull请求。

支持

对于问题和疑问:

  1. 检查上面的故障排除部分
  2. 跑 Get-WatcherStatus.ps1 诊断
  3. 查看最近的日志 logs/ 目录
  4. 检查Windows事件查看器中的任务计划程序错误

创建于:桥接WSL和Windows环境,实现无缝脚本执行 版本: 1.0.0 最后更新:2025年1月