Read more: https://devblogs.microsoft.com/commandline/tar-and-curl-come-to-windows/
Попробуйте, используя curl
перенаправление вывода команды на findstr
с /b<sub><b>eginning of a line</b></sub>
и примените оператор &&
(return 0
) и подавление любого вывода >nul
curl .... | findstr /b HTTP/1\.1.*200 >nul && echo\ zOk!
@echo off & setlocal EnableDelayedExpansion
rem :: Ask for initializing info (string input)
set /p "_url=Which page do you want to scan?: "
rem :: Using Microsoft's website as the test site
set "_websiteurl=https://www.microsoft.com/!_url!"
rem :: Start scan, only get header info to save bandwidth, I can not use grep since I am on a windows computer and if match (&&) goto to :Next
2>&1 %__APPDIR__%curl.exe -i "!_websiteurl!"|%__APPDIR__%findstr.exe /b HTTP/1\.1.*200 >nul && echo\Great the page exists! && goto=:Next
2>&1 %__APPDIR__%curl.exe -i "!_websiteurl!"|%__APPDIR__%findstr.exe /b HTTP/1\.1.*404 >nul && echo\The page does not exist && goto=:Next
2>&1 %__APPDIR__%curl.exe -i "!_websiteurl!"|%__APPDIR__%findstr.exe /b HTTP/1\.1.*301 >nul && echo\This page is moved permanently && goto=:Next
2>&1 %__APPDIR__%curl.exe -i "!_websiteurl!"|%__APPDIR__%findstr.exe /b HTTP/1\.1.*302 >nul && echo\This page is moved temporarily && goto=:Next
rem :: If any string output from each one curl command above does not match for any [200|301|302|404] string, then got the output from the server
echo\None found: [200^|404^|301^|302] & 2>&1 %__APPDIR__%curl.exe -i "!_websiteurl!"|%__APPDIR__%findstr.exe /b HTTP.1\.*[0-9] >con: & goto=:Next
:Next
rem./ do more here... & endlocal
Which page do you want to scan?: store
This page is moved temporarily
Which page do you want to scan?: inbox
None found: [200|404|301|302]
HTTP/1.1 440 Login Timeout
Which page do you want to scan?: mail
This page is moved permanently
@echo off
setlocal EnableDelayedExpansion
color 0A & title <nul & title %~nx0
set "_bat=%~dpnx0" && cd /d "%~dp0"
set "_msg_error=Incorrect input^!! Press any key to continue..."
set "_code_http=200=Great the page exists^!!,301=Page moved Permanently"
set "_code_http=!_code_http!,302=Page moved temporarily,404=Page does not exist"
:LOOP
set /p "_string=Which page do you want to scan?: " || <nul (
<con: set /p "'=!_msg_error!" & echo;& goto=:LOOP) || goto=:LOOP
if exist %__APPDIR__%curl.exe set "_curl=%__APPDIR__%curl.exe" && goto=:check
for /f tokens^=* %%i in ('2^>nul "%__APPDIR__%where.exe" /r "%~dp0." curl.exe
')do <con: set "_curl=%%~i" && goto=:CHECK
:ERROR
if not defined _curl (
echo\ERROR: "cUrl.exe" was not found in your %%path%% or in "%~dp0?.."^!!
%__APPDIR__%timeout.exe -1 & endlocal & goto=:EOF
) else goto=:OTHERS
:CHECK
set "_string=https://www.microsoft.com/en-us/!_string!"
(for %%i in ("!_code_http:,=","!")do for /f tokens^=1-2delims^=^= %%I in ('echo\%%~i'
)do 2>nul "!_curl!" -i "!_string!"|%__APPDIR__%findstr.exe /b HTTP/1\.1.*%%~I && (
<con: set /p "'=!_string! status: %%I %%J" <nul & set "_answer=%%~I" && set "_resp=%%~J" && (
goto=:NEXT ))) || goto=:ERROR
:NEXT
echo\!_answer!|%__APPDIR__%findstr.exe 30[1-2] >nul && for /f tokens^=2 %%u in (
'^<con: "!_curl!" -i "!_string!"^|find/i "location"')do set "_url_to=%%~u"
if defined _url_to <con: set /p "'=!_string! --^> !_url_to!" <nul
rem :: You can to continue your batch script task and using this variables bellow
rem :: !_answer! == 200, 301, 302 or 404 // any other server response goto=:ERROR
rem :: !_string! == https://www.microsoft.com concatenated with user string input
rem :: !_url_to! == the shortner url expanded to the url redirected by 301 or 302
rem :: !_resp! == server response sting set in _code_http 2nd token delimiter =
rem :: !_curl! == curl saved with a fully qualified path name: %path% or %~dp0.
endlocal & goto :EOF
:OTHERS
pushd %__APPDIR__% && for /f tokens^=2* %%i in (
'2^>^&1 "!_curl!" -i "!_string!"^|findstr.exe /b HTTP.1\.1.
')do 2>&1 findstr.exe /bx %%~i "!_bat!" || set "_output=%%~i %%~j" && popd
if defined _output echo\Unknown or unlisted output: !_output!
<con: rem./&& %__APPDIR__%timeout.exe -1 & endlocal & goto :EOF
:: ---------------------------------------------------------- ::
:: HTTP response status codes for using in label :OTHERS ::
:: Official / unofficial : IIS * AWS Elastic Load Balancer ::
:: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes ::
:: ---------------------------------------------------------- ::
100 Continue
101 Switching Protocols
102 Processing / Checkpoint
103 Early Hints
104 Unassigned
105 Unassigned
106 Unassigned
107 Unassigned
108 Unassigned
109 Unassigned
110 Unassigned
111 Unassigned
112 Unassigned
113 Unassigned
114 Unassigned
115 Unassigned
116 Unassigned
117 Unassigned
118 Unassigned
119 Unassigned
120 Unassigned
121 Unassigned
122 Unassigned
123 Unassigned
124 Unassigned
125 Unassigned
126 Unassigned
127 Unassigned
128 Unassigned
129 Unassigned
130 Unassigned
131 Unassigned
132 Unassigned
133 Unassigned
134 Unassigned
135 Unassigned
136 Unassigned
137 Unassigned
138 Unassigned
139 Unassigned
140 Unassigned
141 Unassigned
142 Unassigned
143 Unassigned
144 Unassigned
145 Unassigned
146 Unassigned
147 Unassigned
148 Unassigned
149 Unassigned
150 Unassigned
151 Unassigned
152 Unassigned
153 Unassigned
154 Unassigned
155 Unassigned
156 Unassigned
157 Unassigned
158 Unassigned
159 Unassigned
160 Unassigned
161 Unassigned
162 Unassigned
163 Unassigned
164 Unassigned
165 Unassigned
166 Unassigned
167 Unassigned
168 Unassigned
169 Unassigned
170 Unassigned
171 Unassigned
172 Unassigned
173 Unassigned
174 Unassigned
175 Unassigned
176 Unassigned
177 Unassigned
178 Unassigned
179 Unassigned
180 Unassigned
181 Unassigned
182 Unassigned
183 Unassigned
184 Unassigned
185 Unassigned
186 Unassigned
187 Unassigned
188 Unassigned
189 Unassigned
190 Unassigned
191 Unassigned
192 Unassigned
193 Unassigned
194 Unassigned
195 Unassigned
196 Unassigned
197 Unassigned
198 Unassigned
199 Unassigned
200 OK
201 Created
202 Accepted
203 Non-Authoritative Information
204 No Content
205 Reset Content
206 Partial Content
207 Multi-Status
208 Already Reported
209 Unassigned
210 Unassigned
211 Unassigned
212 Unassigned
213 Unassigned
214 Unassigned
215 Unassigned
216 Unassigned
217 Unassigned
218 Unassigned / This is fine
219 Unassigned
220 Unassigned
221 Unassigned
222 Unassigned
223 Unassigned
224 Unassigned
225 Unassigned
226 IM Used
227 Unassigned
228 Unassigned
299 Unassigned
300 Multiple Choices
301 Moved Permanently
302 Found (Previously "Moved temporarily")
303 See Other
304 Not Modified
305 Use Proxy
306 Switch Proxy
307 Temporary Redirect
308 Permanent Redirect
309 Unassigned
310 Unassigned
311 Unassigned
312 Unassigned
313 Unassigned
314 Unassigned
315 Unassigned
316 Unassigned
317 Unassigned
318 Unassigned
319 Unassigned
320 Unassigned
321 Unassigned
322 Unassigned
323 Unassigned
324 Unassigned
325 Unassigned
326 Unassigned
327 Unassigned
328 Unassigned
329 Unassigned
330 Unassigned
331 Unassigned
332 Unassigned
333 Unassigned
334 Unassigned
335 Unassigned
336 Unassigned
337 Unassigned
338 Unassigned
339 Unassigned
340 Unassigned
341 Unassigned
342 Unassigned
343 Unassigned
344 Unassigned
345 Unassigned
346 Unassigned
347 Unassigned
348 Unassigned
349 Unassigned
350 Unassigned
351 Unassigned
352 Unassigned
353 Unassigned
354 Unassigned
355 Unassigned
356 Unassigned
357 Unassigned
358 Unassigned
359 Unassigned
360 Unassigned
361 Unassigned
362 Unassigned
363 Unassigned
364 Unassigned
365 Unassigned
366 Unassigned
367 Unassigned
368 Unassigned
369 Unassigned
370 Unassigned
371 Unassigned
372 Unassigned
373 Unassigned
374 Unassigned
375 Unassigned
376 Unassigned
377 Unassigned
378 Unassigned
379 Unassigned
380 Unassigned
381 Unassigned
382 Unassigned
383 Unassigned
384 Unassigned
385 Unassigned
386 Unassigned
387 Unassigned
388 Unassigned
389 Unassigned
390 Unassigned
391 Unassigned
392 Unassigned
393 Unassigned
394 Unassigned
395 Unassigned
396 Unassigned
397 Unassigned
398 Unassigned
399 Unassigned
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Payload Too Large
414 URI Too Long
415 Unsupported Media Type
416 Range Not Satisfiable
417 Expectation Failed
418 I'm a teapot / Page Expired
419 Unassigned / Page Expired
420 Unassigned / Method Failure / Enhance Your Calm
421 Misdirected Request
422 Unprocessable Entity
423 Locked
424 Failed Dependency
425 Too Early
426 Upgrade Required
427 Unassigned
428 Precondition Required
429 Too Many Requests
430 Unassigned / Request Header Fields Too Large
431 Request Header Fields Too Large
432 Unassigned
433 Unassigned
434 Unassigned
435 Unassigned
436 Unassigned
437 Unassigned
438 Unassigned
439 Unassigned
440 Unassigned
441 Unassigned
442 Unassigned
443 Unassigned
444 Unassigned
445 Unassigned
446 Unassigned
447 Unassigned
448 Unassigned
449 Unassigned
450 Unassigned / Blocked by Windows Parental Controls (Microsoft)
451 Unavailable For Legal Reasons
452 Unassigned
452 Unassigned
453 Unassigned
454 Unassigned
455 Unassigned
456 Unassigned
457 Unassigned
458 Unassigned
459 Unassigned
460 Unassigned * Client closed the connection
461 Unassigned * The load balancer received an X-Forwarded-For
462 Unassigned
463 Unassigned
464 Unassigned
465 Unassigned
466 Unassigned
467 Unassigned
468 Unassigned
469 Unassigned
470 Unassigned
471 Unassigned
472 Unassigned
473 Unassigned
474 Unassigned
475 Unassigned
476 Unassigned
477 Unassigned
478 Unassigned
479 Unassigned
480 Unassigned
481 Unassigned
482 Unassigned
483 Unassigned
484 Unassigned
485 Unassigned
486 Unassigned
487 Unassigned
488 Unassigned
489 Unassigned
490 Unassigned
491 Unassigned
492 Unassigned
493 Unassigned
494 Unassigned
495 Unassigned
496 Unassigned
497 Unassigned
498 Unassigned / Invalid Token
499 Unassigned / Token Required
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported
506 Variant Also Negotiates
507 Insufficient Storage
508 Loop Detected
509 Unassigned / Bandwidth Limit Exceeded
510 Not Extended
511 Network Authentication Required
512 Unassigned
513 Unassigned
514 Unassigned
515 Unassigned
516 Unassigned
517 Unassigned
518 Unassigned
519 Unassigned
520 Unassigned
521 Unassigned
522 Unassigned
523 Unassigned
524 Unassigned
525 Unassigned
526 Unassigned / Invalid SSL Certificate
527 Unassigned
528 Unassigned
529 Unassigned / Site is overloaded
530 Unassigned / Site is frozen
531 Unassigned
532 Unassigned
533 Unassigned
534 Unassigned
535 Unassigned
536 Unassigned
537 Unassigned
538 Unassigned
539 Unassigned
540 Unassigned
541 Unassigned
542 Unassigned
543 Unassigned
544 Unassigned
545 Unassigned
546 Unassigned
547 Unassigned
548 Unassigned
549 Unassigned
550 Unassigned
551 Unassigned
552 Unassigned
553 Unassigned
554 Unassigned
555 Unassigned
556 Unassigned
557 Unassigned
558 Unassigned
559 Unassigned
560 Unassigned
561 Unassigned
562 Unassigned
563 Unassigned
564 Unassigned
565 Unassigned
566 Unassigned
567 Unassigned
568 Unassigned
569 Unassigned
570 Unassigned
571 Unassigned
572 Unassigned
573 Unassigned
574 Unassigned
575 Unassigned
576 Unassigned
577 Unassigned
578 Unassigned
579 Unassigned
580 Unassigned
581 Unassigned
582 Unassigned
583 Unassigned
584 Unassigned
585 Unassigned
586 Unassigned
587 Unassigned
588 Unassigned
589 Unassigned
590 Unassigned
591 Unassigned
592 Unassigned
593 Unassigned
594 Unassigned
595 Unassigned
596 Unassigned
597 Unassigned
598 Unassigned /(Informal convention) Network read timeout error
599 Unassigned
Which page do you want to scan?: store
HTTP/1.1 301 Moved Permanently
https://www.microsoft.com/en-us/store status: 301 Page moved Permanently
https://www.microsoft.com/en-us/store --> https://www.microsoft.com/en-us/store/b/home
1. Определите коды ответов и соответствующие сообщения для каждого из них:
200=Great the page exists^!!
2. Определите, что уже заполняется псевдо-массив этими значениями / строка, разделенная ,
в двойных кавычках, и в случае использования этого объявления в двух строках вы можете объединить set "variable=!Variable!,More Values"
set "_code_http=200=Great the page exists^!!,301=Page moved Permanently"
set "_code_http=!_code_http!,301=Page moved Temporarily,404=Page does not exist"
- Переменной установлено это значение:
200=Great the page exists^!!,301=Page moved permanently,301=Page moved temporarily,404=Page does not exist
3. . Вы можете использовать команду set /p
, которая уже реализует некоторый элемент управления для обработки потенциальных ошибок в действиях ввода пользователем, используя операторы, goto
и некоторое сообщение об ошибке для использования зацикленного :label
:LOOP
set /p "_string=Which page do you want to scan? :" || <nul (
<con: set /p "'=!_msg_error!" & echo;& goto :LOOP) || goto=:LOOP
4. Объединяет строку, сохраненную во входных данных в переменную string
, уже добавляя ссылку / сайт, и в то же время устанавливая значение переменной string
, чтобы она соответствовала полной ссылке .. .
set "_string=https://www.microsoft.com/en-us/!_string!"
5. Учитывая, что последние версии Windows 10 уже идут с curl.exe
(tar.exe idem), этот пункт проверяет наличие curl в системная папка. Здесь также считается предрасположенным, если пользователь сам вручную добавил завиток в версию / сборку, которой нет, код будет искать папку и подпапки, в которых была вызвана летучая мышь, и где ее найти, он сохранит полную путь к исполняемому файлу.
- Obs.: Если не находит, go сразу выполняет действия метки
:ERROR
if exist %__APPDIR__%curl.exe set "_curl=%__APPDIR__%curl.exe" && goto=:check
for /f tokens^=* %%i in ('2^>nul "%__APPDIR__%where.exe" /r "%~dp0." curl.exe
')do <con: set "_curl=%%~i" && goto=:CHECK
6. Объедините строку из ввода (!_string!
) со ссылкой.
set "_string=https://www.microsoft.com/en-us/!_string!"
7. Используйте for
l oop для отображения каждого элемента в его псевдо-арри, используя подстроку, которая превращает ,
в ","
, таким образом составляя используемую строку в l oop, что будет / оставаться в использовании таким образом:
for %%i in ("!_code_http:,=","!")do...
rem :: the same ::
for %%i in ("200=Great the page exists^!!","301=Page moved permanently","301=Page moved temporarily","404=Page does not exist")do....
8. Возьмите переменную l oop из массива, где разделитель =
будет с кодом 1-го токена , а второй - ответы, и присоединяйтесь к ним, составляя синтаксис curl, проецируя вывод для использования findstr
, который будет искать для кода в начале строки, чтобы соответствовать, если это произойдет, у нас есть код в %%I
и текст ответа в %%J
...
for /f tokens^=1-2delims^=^= %%I in ('echo\%%~i'
)do 2>nul "!_curl!" -i "!_string!"|%__APPDIR__%findstr.exe /b HTTP/1\.1.*%%~I && (
9. findstr
получил вывод curl
как вход для фильтра /, чтобы найти код ответа (пришёл от 1-го l oop), но сам вывод findstr
не нужно имитировать на экране, он просто имеет значение, совпало оно или нет, если оно совпало, findstr return 0
или return non 0
, и оператор (здесь &&
) выполнит действие для определения переменных и go для метки :NEXT
в случае элемент, обрабатываемый в цикле первого for
, обнаруживается при выполнении findstr
в текущем l oop (2nd).
- Obs.: Если нет кодов в первом токене обнаруживаются с выходами curl во всех тех, которые работают в l oop, действие приводит к переходу на метку
:ERROR
...findstr.exe /b HTTP/1\.1.*%%~I && (
<con: set /p "'=!_string! status: %%I %%J" <nul & set "_answer=%%~I" && set "_resp=%%~J" && ( goto=:NEXT ))) || goto=:ERROR
10. При вводе метки «СЛЕДУЮЩИЙ» findstr
проверит, является ли в переменной !_answer!
сохраненное значение 301
или 302
, где e для этих значений, соответствующие места назначения перенаправителей (location:
) будут отображены на экране, а результаты URL-адресов будут сохранены в переменной !_url_to!
, обрабатываемой for /f
только l oop если findstr return 0
, ...
:NEXT
echo\!_answer!|%__APPDIR__%findstr.exe 30[1-2] >nul && for /f tokens^=2 %%u in (
'^<con: "!_curl!" -i "!_string!"^|find/i "location"')do set "_url_to=%%~u"
if defined _url_to <con: set /p "'=!_string! --^> !_url_to!" <nul
11. Вы можете удалить все строки rem :: ...
, на этом этапе вы можете использовать для реализации других функций в вашем пакете, по завершении он завершает локальный набор и переходит к концу файла (:EOF
), игнорирование всех следующих строк и завершение выполнения скрипта ...
rem :: You can to continue your batch script task and using this variables bellow
rem :: !_answer! == 200, 301, 302 or 404 // any other server response goto=:ERROR
rem :: !_string! == https://www.microsoft.com concatenated with user string input
rem :: !_url_to! == the shortner url expanded to the url redirected by 301 or 302
rem :: !_resp! == server response sting set in _code_http 2nd token delimiter =
rem :: !_curl! == curl saved with a fully qualified path name: %path% or %~dp0.
12. Метка ERROR
может вызываться в различных точках действий кода, обусловленных результаты выполненных выполнений, когда это происходит, он проверяет, была ли определена переменная culr или нет, если culr.exe не был найден, он возвращает сообщение об этом и завершает выполнение.
:ERROR
if not defined _curl (
echo\ERROR: "cUrl.exe" was not found in your %%path%% or in "%~dp0?.."^!!
%__APPDIR__%timeout.exe -1 & endlocal & goto=:EOF
13. Для случаев, когда был определен curl
, выполнение будет продолжено / go на метке :OTHERS
) else pushd "%__APPDIR__%" && goto=:OTHERS
14. По-прежнему можно проверить, отличается ли какой-либо код, на который отвечает сервер, от элементов / значений, присутствующих в созданном псевдо-массиве, поэтому все еще возможно / допустимо попытаться получить эту информацию ответа, confronti ng с большим списком, чем просто четыре кода, сохраненных в массиве, используя findstr для получения ответа независимо от элементов массива и в более широком смысле
:OTHERS
pushd %__APPDIR__% && for /f tokens^=2 %%i in (
'2^>^&1 "!_curl!" -i "!_string!"^|findstr.exe /b HTTP.1\.1....
15. Команда type обработает файл bat, который содержит самый широкий список возможных ответов сервера
')do findstr.exe /bx %%~i "!_bat!"
16. Если вывод кода curl
отсутствует в списке bat, там они все еще можно добавить, и соответствующий код будет отображаться на экране
|| set "_output=%%~i %%~j" && popd
if defined _output echo\Unknown or unlisted output: !_output!
17. Выполняется неопределенный тайм-аут, setlocal
завершается и переходит прямо к окончательному файлу , пропуская оставшиеся строки и немедленно останавливая выполнение бита.
<con: rem./&& %__APPDIR__%timeout.exe -1 & endlocal & goto :EOF
Which page do you want to scan?: storeX
HTTP/1.1 404 Not Found
https://www.microsoft.com/en-us/storeX status: 404 Page does not exist
Which page do you want to scan?: .
HTTP/1.1 200 OK
https://www.microsoft.com/en-us/. status: 200 Great the page exists