Я работаю над сценарием, который предлагает вам скопировать целые структуры папок, включая ACL (разрешения). Мой вопрос теперь в том, как я могу сделать так, чтобы когда я нажимал кнопку отмены во всплывающем окне, он действительно отменялся?
Я работаю с PowerShell
**#----------------------Source Drive and Folder---------------------#
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null
$sourceDrive = [Microsoft.VisualBasic.Interaction]::InputBox("Please enter the source drive for copying `n(e.g: C)", "source drive", "")
$sourceFolder = [Microsoft.VisualBasic.Interaction]::InputBox("Please enter the source folder for copying `n(e.g: Folder\Something)", "source folder", "")
#----------------------Source Drive and Folder---------------------#
#-------------------Destination Drive and Folder-------------------#
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null
$destinationDrive = [Microsoft.VisualBasic.Interaction]::InputBox("Please enter the destination drive for copying `n(e.g: D)", "destination drive", "")
$destinationFolder = [Microsoft.VisualBasic.Interaction]::InputBox("Please enter the destination folder for copying `n(e.g: Folder1\Something2)", "destination folder", "")
#-------------------Destination Drive and Folder-------------------#
#--------------------Create new Folder for Copy--------------------#
$createNewFolder = [Microsoft.VisualBasic.Interaction]::InputBox("Do you want to create a new folder in this directory? `n(e.g: y/n)", "Create new folder", "")
if($createNewFolder -eq "n"){
xcopy "$sourceDrive`:\$sourceFolder" "$destinationDrive`:\$destinationFolder" /O /X /E /H /K
}elseif($createNewFolder -eq "y") {
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null
$newFolder = [Microsoft.VisualBasic.Interaction]::InputBox("Please enter the name of the folder `n(e.g: somefolder)", "New folder", "")
xcopy "$sourceDrive`:\$sourceFolder" "$destinationDrive`:\$newfolder\$destinationFolder" /O /X /E /H /K
}else {
}
#--------------------Create new Folder for Copy--------------------#
#xcopy "$sourceDrive`:\$sourceFolder" "$destinationDrive`:\$destinationFolder" /O /X /E /H /K**
Это также было размещено на powershell.org: https://powershell.org/forums/topic/how-can-i-make-my-script-stop-when-clicked-on-the-cancel-button-2/
заранее спасибо
Мартин
Помог ли какой-либо из наших ответов? — person Martin Schmidt schedule 06.11.2020
Согласно документации </ а>:
Так ты всегда можешь сделать
(Чтобы узнать, использовать ли
break
,return
илиexit
, см.здесь.)
Конечно, строка также была бы пустой, если бы пользователь нажал «ОК», но не заполнил поле ввода. Но я думаю, что к этим двум случаям можно относиться одинаково. В качестве альтернативы вы можете создать собственное диалоговое окно запроса с помощью Windows Forms и вернуть DialogResult.
Обратите внимание, что это не рекомендуемый способ ввода данных в сценарий Powershell. Вам следует использовать Читать -Host:
Или, что еще лучше, работайте с параметры (PowerShell автоматически запросит ввод)
Лично я не понимаю, почему вы хотите использовать все эти InputBoxes, где вам может хватить простого диалога FolderBrowser (дважды).
Используя этот диалог, вы также можете быть уверены, что пользователь не просто введите что-нибудь, и вам не придется проверять каждый шаг.
Ниже функция
Get-FolderPath
— это вспомогательная функция для завершения вызова диалогового окна BrowseForFolder, чтобы облегчить вашу жизнь.Имея это место в верхней части вашего скрипта, код может быть таким простым, как:
Если пользователь нажимает «Отмена» при любом из обоих вызовов
Get-FolderPath
, сценарий завершается.