• Как через powershell изменить строку в файле (массиве) в соответствии с заданным условием и вернуть её?

    @Habarovchanin Автор вопроса
    pumpkinm
    Спасибо за Вашу помощь и предложенное решение! Почти всё отработало так, как надо.
    Оформите, пожалуйста, ответ, чтобы можно было пометить его как решение.
    Почему‐то все комментарии были удалены... Ваш рабочий вариант был такой:
    $In = [io.file]::ReadAllLines("d:\in.txt", [text.encoding]::GetEncoding(65001))
    $Out = @()
    foreach ($str in $In) {
      for (($i=$str.length-1); ($i -ge 0); $i--) {
        if ([int][char]$str.Chars($i) -band 128) {
          if ([int][char]$str.Chars(($i+1)) -eq 92) {
            $str = $str.Insert(($i+1), "\")
          	}
          }
        }
      Write-Output $str
      $Out += $str
    }
    
    [io.file]::WriteAllLines("d:\out.txt", $Out, [text.encoding]::GetEncoding(65001))
  • Как через powershell изменить строку в файле (массиве) в соответствии с заданным условием и вернуть её?

    @Habarovchanin Автор вопроса
    MaxKozlov,
    День добрый!
    Благодарю, что откликнулись и предложили варианты решения.
    Для этой задачи воспользовался предложенным pumpkinm вариантом.
    Ещё раз благодарю за оказанную Вами помощь.

    P. S. А куда делись все комментарии? Хабр их удаляет что ли?!
  • Как через powershell изменить строку в файле (массиве) в соответствии с заданным условием и вернуть её?

    @Habarovchanin Автор вопроса
    @NortheR73
    @sergueik

    Ребята, рассчитываю, что вы укажите нужное направлении
  • Проверка доступности URI‐адреса средствами powershell на подобие curl?

    @Habarovchanin Автор вопроса
    Роман Безруков,
    Каюсь, Роман!
    Просмотрел этот комментарий... ;(
    Попробую сейчас.
    Спасибо!
  • Проверка доступности URI‐адреса средствами powershell на подобие curl?

    @Habarovchanin Автор вопроса
    сергей кузьмин,
    Вы правы, Сергей, он их не подавляет. Но это, на данном этапе и для этой задачи, не требуется пока.
    Он получает корректный код возврата проверки соединения и передаёт его для дальнейшей обработки.

    powershell -nologo -noprofile "%{[Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls, Ssl3'};(Invoke-WebRequest -Uri www.googla.com -UseBasicParsing).StatusCode;exit [int]$Error[0].Exception.Status"
    
    Invoke-WebRequest : Невозможно разрешить удаленное имя: 'www.googla.com'
    строка:1 знак:77
    + %{[Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls, Ssl3'};(Invo ...
    +                                                                             ~
    ~~~
        + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
        + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
    
    
    echo %errorlevel%
    1


    Что вполне соответствует
    NameResolutionFailure 1 The name resolver service could not resolve the host name.


    Другого от него пока и не требуется.
  • Проверка доступности URI‐адреса средствами powershell на подобие curl?

    @Habarovchanin Автор вопроса
    сергей кузьмин,
    Да, Сергей!
    Если бы я увидел Ваш ответ раньше или хотя бы знал чуть больше о PowerShell, то нашёл бы это решение раньше. Но, в любом случае, не зря потратил полдня на копание в PowerShell.
    Решение нашёл!
    Огромное спасибо всем вам за подсказки и указание направления!
    Сейчас попробую описать решение, может кому‐то пригодится.
  • Проверка доступности URI‐адреса средствами powershell на подобие curl?

    @Habarovchanin Автор вопроса
    Роман Безруков,
    Надо для Windows. Причём Windows начиная от Windows 7 до Windows 11 и с минимально поддерживаемой версией powershell 3.0.
    Под исходным скриптом Вы подразумеваете "test_urls.vim"? Там основное, — это функции TestURL(), которая принимает ранее подготовленный URL, отдаёт его "curl", считывает код возврата от "curl" из потока 'sdterr' и это передаёт в вышестоящую вызывающую функцию Test_Chek_URLs(). А уже последняя выводит результат в новое окно. Т. е. основная задача — это проверить корректность и доступность URL.
    Поэтому и требуется, чтобы PS-код отправился в cmd.exe (которая на большинстве машин прописана как оболочка по умолчанию в параметре 'shell'), сделал своё дело и поместил результат в 'stderr'. Сам "test_urls.vim" должен работать как под Windows, так и под UNIX-like системами с тем же функционалом и минимально возможными изменениями.

    Смотрите. Вчера, благодаря подсказке сергей кузьмин , я вроде как нашёл приемлемое решение, отрабатывающее аналогично "curl".

    powershell -nologo -noprofile "%{[Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls, Ssl3'};Invoke-WebRequest -Uri https://www.cisco.com -UseBasicParsing | select-object -expandproperty statuscode;exit [int]$Error[0].Exception.Response.StatusCode"

    echo %ERRORLEVEL%
    0

    При удачной обработке URL, получаем StatusCode 200 и в "stderr" заносится "0".

    powershell -nologo -noprofile "%{[Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls, Ssl3'} ;Invoke-WebRequest -Uri http://directory.google.com/Top/Computers/Software/Operating_Systems/Unix/Win32 -UseBasicParsing | select-object -expandproperty statuscode;exit [int]$Error[0].Exception.Response.StatusCode"

    echo %ERRORLEVEL%
    502

    При не удачной, PowerShell пишет в консоль Exception (от этого, я так понял, никуда не деться), но, самое главное, в "stderr" заносится StatusCode — 502.
    Вроде, всё нормально. Примерно как "curl".
    Но, как оказалось, не всё так. Например, при обработке этого URL cle.linux.org.tw/xcin:
    powershell -nologo -noprofile "%{[Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls, Ssl3'} ;Invoke-WebRequest -Uri http://cle.linux.org.tw/xcin -UseBasicParsing | select-object -expandproperty statuscode;exit [int]$Error[0].Exception.Response.StatusCode"

    Получаем такой Exception
    Invoke-WebRequest : Невозможно разрешить удаленное имя: 'cle.linux.org.tw'
    строка:1 знак:77
    + %{[Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls, Ssl3'} ;Invo ...
    + ~
    ~~~
    + CategoryInfo: InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

    Как видите, здесь нет номера StatusCode и, соответственно, в "stderr" заносится значение "0":
    echo %ERRORLEVEL%
    0

    Как с этим бороться, я даже не представляю.
    Аналогичная ситуация ситуация и для "FTP". Там вообще не возвращается никаких StatusCode.
    Почему так происходит? Куда копать? И что можно сделать?
  • Проверка доступности URI‐адреса средствами powershell на подобие curl?

    @Habarovchanin Автор вопроса
    сергей кузьмин,
    Это очень печальное известие!
    Т. е. доступных средств сделать так, чтобы не гадил в консоль нет?!
    Хорошо, а можно ли тогда как‐то сделать, чтобы в stderr попадал HttpStatusCode, а не просто код ошибки выполнения команды?
  • Проверка доступности URI‐адреса средствами powershell на подобие curl?

    @Habarovchanin Автор вопроса
    Вот смотрите.
    Такой вариант отрабатывает примерно так, как надо:
    powershell -nologo -noprofile "%{[Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls, Ssl3'} ;exit Invoke-WebRequest -Uri https://www.cisco.com -UseBasicParsing | select-object -expandproperty statuscode" 2>&1

    На выходе получаем то, что и ожидалось в потоке stderr
    echo %ERRORLEVEL%
    200


    Но если возникает ошибка при обработке URL (т. е. URL не доступен), то всё перестаёт работать.
    Во‐первых, начинает гадить в консоль пояснениями. Во‐вторых, в %ERRORLEVEL% помещается не код от StatusCode, а просто ошибка выполнения. А должен быть именно код состояния.

    powershell -nologo -noprofile "%{[Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls, Ssl3'} ;exit Invoke-WebRequest -Uri http://directory.google.com/Top/Computers/Software/Operating_Systems/Unix/Win32 -UseBasicParsing | select-object -expandproperty statuscode" 2>&1
    
    Invoke-WebRequest : 502. That’s an error. The server encountered a temporary error and could not complete your request.Please try again in 30 seconds. That’s all we know.
    строка:1 знак:82
    + %{[Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls, Ssl3'} ;exit ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
        + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

    И в %ERRORLEVEL%
    d:\Programs\Curl\bin>echo %ERRORLEVEL%
    1

    Вместо ожидаемого кода 502
  • Проверка доступности URI‐адреса средствами powershell на подобие curl?

    @Habarovchanin Автор вопроса
    @FluffyBeaver
    VimL — это Vim Language, язык программирования, реализованный в текстовом редакторе Vim.
    Код, где обрабатывается запрос на доступность URL:
    call system(s:command .. shellescape(a:url))
    return printf("%s %d", a:url, v:shell_error)

    где system() — функция, получающая из командной оболочки возвращаемое значение в виде строки;s:command — переменная, содержащая исполняемую команду; shellescape() — функция, экранирующая передаваемые в команду данные, приемлемым для командной оболочки способом; v:shell_error — содержит код возврата, полученный от исполняемой команды.
    В частности s:commadn содержит такую команду curl --silent --fail --output nul --head.
    Требуется так же предать команду «powershell» и получить от неё код возврата. Всё.
    Сам сценарий находится здесь
    Программа «curl» возвращает код завершения (exit code) в поток stderr консоли. От туда его получает программа Vim и дальше уже обрабатывается, так как требуется.
    Т. е., в отношении «PowerShell», нужен простой код 200, 503 и т. п. результата обращения Invoke-WebRequest по указанному URL. Этот код желательно очень чтобы был в stderr.
    Ну, вот, как‐то так.

    сергей кузьмин
    Нет. Писать скрипт я не умею. Вы дайте, пожалуйста, направление, а я попробую разобраться. Но обращаю Ваше внимание, что очень желательно, чтобы это была одна командная строка.
    Сейчас пробую копать в строну Select-Object.
  • Проверка доступности URI‐адреса средствами powershell на подобие curl?

    @Habarovchanin Автор вопроса
    Роман Безруков
    Благодарю.
    Да, что‐то похожее! Но есть моменты.
    1. Это должна быть, по возможность, именно именно одна строка вызова, а не командный файл.
    Т. е. из внешнего, скажем так, скрипта вызывается команда, а потом во «внешнем скрипте» считывается код возврата этой команды.
    2. При ошибке соединения возвращаемое сообщение от "powershell" очень многословное.
    Например:
    PS C:\Users\Admin> (Invoke-WebRequest -Uri https://jigsaw.w3.org/css-validator).StatusCode
    200

    Это нормально, просто код. Я потом могу его получить и вставить в текстовый буфер.
    PS C:\Users\Admin> (Invoke-WebRequest -Uri ftp://ftp.ilog.fr/pub/Users/haible/gnu/linebreak-0.1.tar.gz ).StatusCode
    Invoke-WebRequest : Невозможно соединиться с удаленным сервером
    строка:1 знак:2
    + (Invoke-WebRequest -Uri ftp://ftp.ilog.fr/pub/Users/haible/gnu/linebreak-0.1.tar ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (System.Net.FtpWebRequest:FtpWebRequest) [Invoke-WebRequest], WebException
        + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

    А вот это уже нет. Можно, конечно, написать какой‐нибудь обработчик, но хотелось бы, чтобы было просто число.
    Как это выглядит в случае с "curl":
    https://jigsaw.w3.org/css-validator/ 0
    Здесь «0» ‐ это код возвращаемый "curl" в stderr
    ftp://ftp.ilog.fr/pub/Users/haible/gnu/linebreak-0.1.tar.gz 28

    «28» — так же код в stderr. Он обозначает
    28  Operation timeout. The specified time-out period was              reached according to the conditions
    , но сейчас это не принципиально.
  • Получить вывод команды командной оболочки в переменную makefile?

    @Habarovchanin Автор вопроса
    MaxKozlov
    Благодарю!
    По пункту № 1.
    Тоже были мысль об этом. Исходил из того, что переменные окружения считываются только в момент запуска обработки и дольше их можно только изменять в пределах сессии, но переменные окружения, созданные уже после запуска makefile, не считываются. Однако как это изящно сделать, не мог придумать. Теперь буду пробовать.
    По пункту № 2.
    В самом nmake я того не знаю, но можно попробовать через $< S@ и подобное. Можно считать содержимое каталога через dir, выделить там только дату и от этого отталкиваться.
    Я так понимаю, что Вы предлагаете считать дату файла powershell.exe и сходить из этого. Попробую.
    Кстати, переменная $PSVersionTable появилась именно в v2, поэтому проверка типа IF $(psvr) <= 2 вам вообще недоступна, в принципе :)

    Вот за это отдельное спасибо. Не знал. В makefile используется параметр -Encoding для Set-Content, который, как я понял, поддерживается начиная с третьей версии.
    По пункту № 3.
    Попробую. Можно попытаться через функционал nmake "встраиваемые файлы".
    В общем буду пробовать. Благодарю ещё раз!
  • Получить вывод команды командной оболочки в переменную makefile?

    @Habarovchanin Автор вопроса
    jcmvbkbc,
    Да, это не совсем GNU make, но схожие моменты есть. Да и тега "nmake" здесь не нашёл.
    Попробовал. к сожалению не отрабатывает.
  • Получить вывод команды командной оболочки в переменную makefile?

    @Habarovchanin Автор вопроса
    MVV
    Благодарю за ответ. Но акцент в вопросе был на makefile.
    Требуется именно при обработке makefile получить вывод этой команды.
    Как из makefile прочитать переменную окружения "PSVER". Как я понимаю, значения переменных считывают только в самом начале обработке makefile.