You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell XAML GUI:点击按钮获取文本框值并传递至数据传输

解决方案:PowerShell XAML GUI 数据传递与Robocopy集成

原代码存在的核心问题

  • 输入文本框未设置x:Name属性,导致无法读取用户实际输入(原代码错误地读取了提示Label的文本)
  • 变量作用域限制:Submit按钮事件内定义的变量是局部变量,Transfer按钮无法访问
  • 提前执行的环境变量设置代码无效,执行时变量尚未被赋值
  • Robocopy路径中的反斜杠未正确处理,会导致路径解析错误

修正后的完整代码

Add-Type -AssemblyName PresentationFramework

# 构建GUI窗口的XAML代码
[xml]$xaml = @"
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="Window" Title="Profile Transfer" WindowStartupLocation = "CenterScreen"
        Width = "460" Height = "220" ShowInTaskbar = "True">
    <Grid Margin="0,0,0,0" Background="#FF3D0198">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="17*"/>
            <ColumnDefinition Width="443*"/>
        </Grid.ColumnDefinitions>
        <Button x:Name="subbttn" Content="Submit Entries" HorizontalAlignment="Left" Margin="290,84,0,0" VerticalAlignment="Top" Width="120" FontFamily="Times New Roman" Grid.Column="1" Height="18"/>
        <Button x:Name="transbttn" Content="TRANSFER Data" HorizontalAlignment="Left" Margin="145,124,0,0" VerticalAlignment="Top" Width="120" FontFamily="Times New Roman" Grid.Column="1" Height="18"/>
        <!-- 为文本框添加x:Name,用于读取用户输入 -->
        <TextBox x:Name="fromCompTextBox" HorizontalAlignment="Left" Margin="290,15,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120" FontFamily="Times New Roman" Grid.Column="1" Height="16"/>
        <TextBox x:Name="toCompTextBox" HorizontalAlignment="Left" Margin="290,38,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120" FontFamily="Times New Roman" Grid.Column="1" Height="16"/>
        <TextBox x:Name="userIdTextBox" HorizontalAlignment="Left" Margin="290,61,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120" FontFamily="Times New Roman" Grid.Column="1" Height="16"/>
        <Label x:Name="fromlbl" Content="What is the name of the Old PC?" HorizontalAlignment="Left" Margin="1,11,0,0" VerticalAlignment="Top" Width="202" Foreground="White" FontFamily="Times New Roman" Grid.Column="1" Height="24"/>
        <Label x:Name="tolbl" Content="What is the name of the New PC?" HorizontalAlignment="Left" Margin="1,34,0,0" VerticalAlignment="Top" Foreground="White" FontFamily="Times New Roman" Grid.Column="1" Height="24" Width="173"/>
        <Label x:Name="uidlbl" Content="What is the USER's ID?" HorizontalAlignment="Left" Margin="1,57,0,0" VerticalAlignment="Top" Foreground="White" FontFamily="Times New Roman" Grid.Column="1" Height="24" Width="126"/>
        <StatusBar Grid.Column="1" Margin="0,147,33,10"/>
    </Grid>
</Window>
"@

$reader = (New-Object System.Xml.XmlNodeReader $xaml)
$window = [Windows.Markup.XamlReader]::Load($reader)

# 获取XAML中的控件对象
$subbttn = $window.FindName("subbttn")
$transbttn = $window.FindName("transbttn")
$fromCompTextBox = $window.FindName("fromCompTextBox")
$toCompTextBox = $window.FindName("toCompTextBox")
$userIdTextBox = $window.FindName("userIdTextBox")

# 定义全局变量,用于跨按钮事件传递数据
$global:fromcompname = ""
$global:tocompname = ""
$global:userid = ""

# Submit按钮点击事件:读取输入并赋值给全局变量
$subbttn.Add_Click({
    # 读取文本框内容
    $global:fromcompname = $fromCompTextBox.Text.Trim()
    $global:tocompname = $toCompTextBox.Text.Trim()
    $global:userid = $userIdTextBox.Text.Trim()

    # 可选:验证输入是否为空
    if ([string]::IsNullOrEmpty($global:fromcompname) -or [string]::IsNullOrEmpty($global:tocompname) -or [string]::IsNullOrEmpty($global:userid)) {
        [System.Windows.MessageBox]::Show("请填写所有必填字段", "输入错误", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Error)
        return
    }

    Write-Host "已获取输入:旧PC=$global:fromcompname,新PC=$global:tocompname,用户ID=$global:userid"
})

# Transfer按钮点击事件:执行Robocopy逻辑
$transbttn.Add_Click({
    # 先验证变量是否已赋值
    if ([string]::IsNullOrEmpty($global:fromcompname) -or [string]::IsNullOrEmpty($global:tocompname) -or [string]::IsNullOrEmpty($global:userid)) {
        [System.Windows.MessageBox]::Show("请先点击「Submit Entries」提交输入信息", "操作提示", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Information)
        return
    }

    # 构建Robocopy路径(注意双反斜杠)
    $sourcePath = "\\$global:fromcompname\c$\Users\$global:userid"
    $destPath = "\\$global:tocompname\c$\Users\$global:userid"

    # 执行Robocopy命令
    C:\windows\system32\Robocopy.exe $sourcePath $destPath `
        "/XJ" "/MIR" "/PURGE" `
        "/R:2" "/W:5" "/XA:SH" "/S" "/256" "/XF" "*.MP3" "desktop.ini" `
        "/XD" "AppData" "Contacts" "Downloads" "Links" "Music" "SapWorkDir" "Searches" "Tracing" "Remote Assistance Logs" "Saved Games"

    # 可选:提示复制完成
    if ($LASTEXITCODE -le 7) {
        [System.Windows.MessageBox]::Show("数据传输完成", "操作完成", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Information)
    } else {
        [System.Windows.MessageBox]::Show("数据传输过程中出现错误,错误代码:$LASTEXITCODE", "传输错误", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Error)
    }
})

$window.ShowDialog()

关键修改说明

  1. 文本框命名:给三个输入文本框添加x:Name属性,确保能正确读取用户输入
  2. 全局变量:使用$global:前缀定义变量,让Submit按钮的赋值能被Transfer按钮访问
  3. 输入验证:添加空值检查,避免执行无效的Robocopy命令
  4. 路径修正:将Robocopy路径中的单反斜杠改为双反斜杠,确保网络路径解析正确
  5. 状态提示:添加MessageBox提示用户操作状态,提升交互体验

内容的提问来源于stack exchange,提问作者SammyD007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:05:29