Я постараюсь изо всех сил задать вопрос.
Вот краткое описание функции.
Dim testPath = "Test-Path 'H:\General\H5841\"
Dim removeDir = "Remove-Item 'H:\General\H5841\"
result = RunScript($"{testPath}{payType}_{payrunNum}_{trials}_{ProcessingDate_DTP.Text}'")
If String.Compare(result, "True") Then
RunScript($"{removeDir}{payType}_{payrunNum}_{trials}_{ProcessingDate_DTP.Text}'")
Output_RTB.Text = "Folder Deleted"
Else
Output_RTB.Text = "Folder Not Found"
End If
Сначала функция проверяет корректность пути. Ниже показано, чему будет равен результат, и он работает в Powershell: true, если папка найдена, в противном случае — false. Это работает.
Test-Path 'H:\General\H5841\G7_999_Final_29.03.24'
Однако, скажем, когда я тестирую это, папка существует, и я запускаю эту функцию, она удаляет папку и предлагает «Папка удалена», но когда я пытаюсь имитировать, что папки нет, она возвращает значение «False», но все равно показывает «Папка удалена», вместо «Папка не найдена».
Когда я начинаю без создания папки, он возвращает False и Folder Not Found. Я не уверен, почему это так себя ведет.
Я также попробовал обычный способ получения результата: «Истина», и он перейдет в состояние «Ложь», несмотря на то, что папка существует. Я использовал MsgBox для запроса переменной результата, а также использовал текстовое поле для проверки пробелов, но его нет.
If result Is "True" Then
RunScript($"{removeDir}{payType}_{payrunNum}_{trials}_{ProcessingDate_DTP.Text}'")
Output_RTB.Text = "Folder Deleted"
Else
Output_RTB.Text = "Folder Not Found"
End If
PS: фигурные скобки представляют собой интерполяцию строк, которая извлекает строки из переменных и формирует элементы управления в VB.net перед преобразованием в команду PowerShell.
Знаете ли вы, почему VB.net не выполняет логическое сравнение должным образом, или я могу использовать другой подход?
заранее спасибо
Чтобы добавить к комментарию Андрея: используйте If String.Compare(result, "True") = 0 Then ...
или просто If result = "True" Then ...
. Обратите внимание, что в обоих случаях при сравнении учитывается регистр, но в первом случае легко сделать регистронезависимым. Оператор is
имеет смысл только для сравнения ссылок на объекты.
Привет @mklement0 Спасибо, я пытался использовать оператор =, и когда папка существует, она все равно переходит в состояние «ложь», а папка подсказки не найдена. Я думаю, что с VB.net произошел сбой, и Option Strict On может быть решением. Однако другие команды, такие как Invoke-Item, если папка существует, команда имеет значение True, и проводник открывает папку. VB.net может сравнивать строку True/False с тем, что было возвращено этой командой. Интересный
@Kinny, возможно, фрагмент кода PowerShell, частью которого является вызов Test-Path
, возвращает нечто большее, чем просто логическое значение, и в этом случае сравнение не будет работать должным образом. Учитывая неявное поведение вывода PowerShell — когда вам приходится активно подавлять возвращаемые значения/вывод команды, который вы не хотите «возвращать» (стал частью вывода), это распространенная проблема. Не видя, что делает ваша функция RunScript
, и не видя репрезентативного расширенного фрагмента кода, проблему невозможно диагностировать.
Почему вы используете для этого PowerShell? Не могли бы вы просто сделать что-то вроде этого:
Option Strict On
Imports System.IO
Public Class Form1
Private Sub btnOkay_Click(sender As Object, e As EventArgs) Handles btnOkay.Click
Dim folderPath As String = txtFolderPath.Text
Output_RTB.Text = TryDeleteFolderAndReportSuccess(folderPath)
End Sub
Private Shared Function TryDeleteFolderAndReportSuccess(folderPath As String) As String
Try
If DeleteFolder(folderPath) Then Return $"Folder '{folderPath}' deleted."
Return $"Folder '{folderPath}' not found!"
Catch ex As Exception
Return $"Folder '{folderPath}' could not be deleted! The following error occurred: {ex.Message}"
End Try
End Function
Private Shared Function DeleteFolder(folderPath As String) As Boolean
Try
Directory.Delete(folderPath, recursive:=True)
Return True
Catch ex As DirectoryNotFoundException
Return False
End Try
End Function
End Class
Спасибо Крису за ваш вклад в этот другой подход. Я использовал powershell, потому что у меня есть несколько команд PS, которые я хочу использовать взаимозаменяемо с элементами управления внешнего интерфейса. На данный момент я использовал вашу рекомендацию для этого процесса.
String.Compare возвращает целое число, но для оператора
If
вам нужно логическое значение. В.Б. что-нибудь придумает, если вы позволите, но вы этого не хотите. Если вы установите Option Strict On для этого проекта (и установите его по умолчанию для новых проектов), то Visual Studio сможет указать вам на подобные проблемы.