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()
关键修改说明
- 文本框命名:给三个输入文本框添加
x:Name属性,确保能正确读取用户输入 - 全局变量:使用
$global:前缀定义变量,让Submit按钮的赋值能被Transfer按钮访问 - 输入验证:添加空值检查,避免执行无效的Robocopy命令
- 路径修正:将Robocopy路径中的单反斜杠改为双反斜杠,确保网络路径解析正确
- 状态提示:添加MessageBox提示用户操作状态,提升交互体验
内容的提问来源于stack exchange,提问作者SammyD007
相关产品推荐
相关产品推荐

