Сравнение строк VB.net с возвращаемым выводом Powershell

Я постараюсь изо всех сил задать вопрос.

Вот краткое описание функции.

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 не выполняет логическое сравнение должным образом, или я могу использовать другой подход?

заранее спасибо

String.Compare возвращает целое число, но для оператора If вам нужно логическое значение. В.Б. что-нибудь придумает, если вы позволите, но вы этого не хотите. Если вы установите Option Strict On для этого проекта (и установите его по умолчанию для новых проектов), то Visual Studio сможет указать вам на подобные проблемы.

Andrew Morton 30.06.2024 15:47

Чтобы добавить к комментарию Андрея: используйте If String.Compare(result, "True") = 0 Then ... или просто If result = "True" Then .... Обратите внимание, что в обоих случаях при сравнении учитывается регистр, но в первом случае легко сделать регистронезависимым. Оператор is имеет смысл только для сравнения ссылок на объекты.

mklement0 30.06.2024 19:56

Привет @mklement0 Спасибо, я пытался использовать оператор =, и когда папка существует, она все равно переходит в состояние «ложь», а папка подсказки не найдена. Я думаю, что с VB.net произошел сбой, и Option Strict On может быть решением. Однако другие команды, такие как Invoke-Item, если папка существует, команда имеет значение True, и проводник открывает папку. VB.net может сравнивать строку True/False с тем, что было возвращено этой командой. Интересный

Kinny 01.07.2024 17:41

@Kinny, возможно, фрагмент кода PowerShell, частью которого является вызов Test-Path, возвращает нечто большее, чем просто логическое значение, и в этом случае сравнение не будет работать должным образом. Учитывая неявное поведение вывода PowerShell — когда вам приходится активно подавлять возвращаемые значения/вывод команды, который вы не хотите «возвращать» (стал частью вывода), это распространенная проблема. Не видя, что делает ваша функция RunScript, и не видя репрезентативного расширенного фрагмента кода, проблему невозможно диагностировать.

mklement0 01.07.2024 17:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Почему вы используете для этого 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, которые я хочу использовать взаимозаменяемо с элементами управления внешнего интерфейса. На данный момент я использовал вашу рекомендацию для этого процесса.

Kinny 01.07.2024 17:36

Другие вопросы по теме