Я пытаюсь создать графический интерфейс для сценария, который я написал некоторое время назад. У меня были небольшие проблемы с этим; Я хотел бы, чтобы кнопка «Отправить записи» регистрировала данные, введенные пользователем, и назначала их переменным ($ fromcompname, $ tocompname, $ userid). Я не уверен, нужна ли мне функция, которая извлекает ввод в текстовые поля и присваивает их этим переменным или тому, что заставит это работать.
Сама форма находится в xaml, которую я сделал в VS Pro, а затем переместил ее в код vs, поскольку я использую powershell для запуска этого скрипта. Появляется окно со всеми элементами. Я просто не уверен, как получить кнопку «отправить записи», чтобы регистрировать данные, введенные пользователем, и передать их остальной части сценария, чтобы включить кнопку «передача данных». Если есть вопрос, который вам нужно задать мне, чтобы лучше понять намерение, пожалуйста, сделайте это, я надеюсь найти ответ. Спасибо.
Код ниже:
Add-Type -AssemblyName PresentationFramework
#Builds the window/form for the GUI
[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"/>
<TextBox HorizontalAlignment = "Left" Margin = "290,15,0,0" TextWrapping = "Wrap" Text = "Old PC" VerticalAlignment = "Top" Width = "120" FontFamily = "Times New Roman" Grid.Column = "1" Height = "16"/>
<TextBox HorizontalAlignment = "Left" Margin = "290,38,0,0" TextWrapping = "Wrap" Text = "New PC" VerticalAlignment = "Top" Width = "120" FontFamily = "Times New Roman" Grid.Column = "1" Height = "16"/>
<TextBox HorizontalAlignment = "Left" Margin = "290,61,0,0" TextWrapping = "Wrap" Text = "User ID" 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)
#Declares the variables based on the Name input in the XAML elements
$subbttn = $window.FindName("subbttn")
$transbttn = $window.FindName("transbttn")
$fromlabel = $window.FindName("fromlbl")
$tolabel = $window.FindName("tolbl")
$useridlabel = $window.FindName("uidlbl")
#Declares the needed data based on the user's input in the Textboxes
$subbttn.Add_Click({
$fromcompname = $fromlabel.Text
$tocompname = $tolabel.Text
$userid = $useridlabel.Text
Write-Host "$fromcompname" "$tocompname" "$userid"
})
#Opens the path to the old PC and the new PC for Robocopy
Set-Item -path env:computername -Value "$fromcompname"
Set-Item -path env:computername -Value "$tocompname"
#Sets the clikc of the transfer data button to initiate the robocopy
$transbttn.Add_Click({
#robocopy is more intelligent
C:\windows\system32\Robocopy.exe "\\$fromcompname\c$\Users\$userid" "\\$tocompname\c$\Users\$userid" `
"/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"
#ROBOCOPY NOTES
#/XJ excludes Junction Directories, breaks the "Application Data" loop Robocopy has a bug with
#/MIR Mirrors a directory tree
#/PURGE Deletes destination files and directories that no longer exist in the source.
#/S Copies subdirectories and excludes empty directories.
#/R:0 Specifies the number of retries on failed copies
#/W:0 Specifies the wait time between retries in seconds
#/XF Excludes Files
#/XD Excludes Directories
#/COPY:DATSOU copies security permissions of folders
})
$window.ShowDialog()
Как прокомментировал TheMadTechnician, вам нужно настроить переменные для текстовых полей в вашем графическом интерфейсе, а не для меток.
Для этого вам также нужно будет дать имена этим текстовым полям, например:
<TextBox x:Name = "fromcompany" HorizontalAlignment = "Left" Margin = "290,15,0,0" TextWrapping = "Wrap" Text = "Old PC" VerticalAlignment = "Top" Width = "120" FontFamily = "Times New Roman" Grid.Column = "1" Height = "16"/>
<TextBox x:Name = "tocompany" HorizontalAlignment = "Left" Margin = "290,38,0,0" TextWrapping = "Wrap" Text = "New PC" VerticalAlignment = "Top" Width = "120" FontFamily = "Times New Roman" Grid.Column = "1" Height = "16"/>
<TextBox x:Name = "userid" HorizontalAlignment = "Left" Margin = "290,61,0,0" TextWrapping = "Wrap" Text = "User ID" VerticalAlignment = "Top" Width = "120" FontFamily = "Times New Roman" Grid.Column = "1" Height = "16"/>
а затем создайте переменные, чтобы иметь возможность ссылаться на них
$fromcompanyTB = $window.FindName("fromcompany")
$tocompanyTB = $window.FindName("tocompany")
$useridTB = $window.FindName("userid")
Внутри обработчиков событий Click() вам нужна область сценария, чтобы иметь возможность использовать эти переменные, иначе они будут просто переменными, локальными для блока сценария:
$subbttn.Add_Click({
$script:fromcompname = $script:fromcompanyTB.Text
$script:tocompname = $script:tocompanyTB.Text
$script:userid = $script:useridlabelTB.Text
Write-Host "$script:fromcompname $script:tocompname $script:userid"
})
То же самое касается $transbttn.Add_Click({})
Наконец, вам нужно поставить пробел перед Content=
в двух последних <Label
строках, иначе Xaml будет недействительным.
Хорошо, я попробую это, как только вернусь в свой офис в понедельник, и вернусь, если это не сработает. Спасибо вам обоим @TheMadTechnician за ваши ответы.
Большое спасибо вам обоим, теперь это работает, и я могу хорошо выглядеть перед своими коллегами, ха-ха. Удачного дня!
Вы никогда не устанавливаете ссылку на свое текстовое поле, в которое пользователь должен вводить информацию. Вы создаете текстовое поле для старого компьютера, нового компьютера и идентификатора пользователя, а также создаете для них метки, затем создаете переменные для этих меток, но никогда для текстовых полей, связанных с каждым из них. В остальном, думаю, все в порядке.