Я нахожусь в каталоге файла, который пытаюсь выполнить, и знаю, что использую правильный текст для выполнения файла, который находится в правильном месте. Файл называется «modify-search.cmd», и я выполняю:
./modify-search.cmd
Однако, поскольку zsh распознает только «эхо», другие команды в моем файле «.cmd» не распознаются, и поэтому моя оболочка zsh сообщает «команда не найдена». Вот код из моего файла modify-search.cmd, за вычетом домена/URL пользователя и ключа администратора.
@echo off
rem Set values for your Search service
set url=YOUR_SEARCH_URL
set admin_key=YOUR_ADMIN_KEY
echo -----
echo Updating the skillset...
call curl -X PUT %url%/skillsets/margies-skillset?api-version=2020-06-30 -H "Content-Type: application/json" -H "api-key: %admin_key%" -d @skillset.json
rem wait
timeout /t 2 /nobreak
echo -----
echo Updating the index...
call curl -X PUT %url%/indexes/margies-index?api-version=2020-06-30 -H "Content-Type: application/json" -H "api-key: %admin_key%" -d @index.json
rem wait
timeout /t 2 /nobreak
echo -----
echo Updating the indexer...
call curl -X PUT %url%/indexers/margies-indexer?api-version=2020-06-30 -H "Content-Type: application/json" -H "api-key: %admin_key%" -d @indexer.json
echo -----
echo Resetting the indexer
call curl -X POST %url%/indexers/margies-indexer/reset?api-version=2020-06-30 -H "Content-Type: application/json" -H "Content-Length: 0" -H "api-key: %admin_key%"
rem wait
timeout /t 5 /nobreak
echo -----
echo Rerunning the indexer
call curl -X POST %url%/indexers/margies-indexer/run?api-version=2020-06-30 -H "Content-Type: application/json" -H "Content-Length: 0" -H "api-key: %admin_key%"
Вот результат, который я получаю в терминале, когда выполняю команду:
./modify-search.cmd: line 1: @echo: command not found
./modify-search.cmd: line 3: rem: command not found
-----
Updating the skillset...
./modify-search.cmd: line 9: call: command not found
./modify-search.cmd: line 11: rem: command not found
./modify-search.cmd: line 12: timeout: command not found
-----
Updating the index...
./modify-search.cmd: line 16: call: command not found
./modify-search.cmd: line 18: rem: command not found
./modify-search.cmd: line 19: timeout: command not found
-----
Updating the indexer...
./modify-search.cmd: line 23: call: command not found
-----
Resetting the indexer
./modify-search.cmd: line 27: call: command not found
./modify-search.cmd: line 29: rem: command not found
./modify-search.cmd: line 30: timeout: command not found
-----
Rerunning the indexer
./modify-search.cmd: line 34: call: command not found
Для меня это имеет смысл, поскольку echo — это встроенная команда в zsh, поэтому @echo не выполняется, но выполняются текстовые сообщения уведомлений. Как мне выполнить эти другие команды «.cmd»?
Я провожу учебные занятия по Microsoft Azure, поэтому использую Azure CLI и делаю все это с помощью кода Visual Studio. Кроме того, я установил расширение Powershell в свой код Visual Studio и не могу заставить его работать там. После активации Powershell (через zsh) я попытался выполнить:
command ./modify-search.cmd
Эта команда дала мне тот же результат, что и моя исполняемая команда на zsh - операторы «echo» сработали, а каждая другая команда вернула «команда не найдена».
Мой неэффективный обходной путь для выполнения лабораторного упражнения заключался в том, чтобы напрямую подключить мой URL-адрес и ключ администратора к коду «.cmd», где бы мой файл ни содержал:
%url% %admin_key%
и выполнять вызовы непосредственно через мою оболочку zsh (подключенную к моему Azure CLI), которая работала в последний раз, когда я столкнулся с этой проблемой.
Я второй раз сталкиваюсь с этой проблемой, поэтому решил попросить о помощи, чтобы найти более эффективное решение в будущем. Помогите, пожалуйста, кто-нибудь?
Обновлено: Обновление, на этот раз моя работа не сработала! В прошлый раз я выполнял команды Azure CLI и подставлял данные аутентификации для подключения к своей учетной записи между этими назначенными разделами. На этот раз я выполняю операторы POST и PUT, и это работает по-другому. Я получаю следующий результат:
zsh: no matches found: %url%/skillsets/margies-skillset?api-version=2020-06-30
Edit2: Хорошо, я пытаюсь вызвать REST API с помощью VS Code, что некоторые из вас, возможно, заметили по коду modify-search.cmd. Я провожу некоторые исследования, связанные с этим, и это может привести меня к решению. На данный момент у меня есть:
Установил расширение REST Client для моей IDE, VS Code.
создал отдельный файл «.rest» без расширений (чтобы текстовый файл впоследствии мог изменить код на файл «.rest»).
Я попытался отправить запрос, но получаю ошибку getaddrinfo ENOTFOUND echo... прогресс
Спасибо, сэр! Это добавляет некоторую ясность тому, что я видел. Я только что понял, что пытаюсь вызвать REST API из своей IDE (VS Code). Извините, только что внес второе редактирование, разъясняющее это. Разумно ли полагать, что команда будет выполнена на сервере Microsoft, куда я отправляю запрос, и, следовательно, эти команды будут работать, если их отправить?
Извините, но я не знаю ответа на этот вопрос.
Опубликованный вами код выглядит как пакетная программа Windows; Я недостаточно владею языком, чтобы понять, будет ли это также допустимо в Powershell, но, поскольку вы пометили вопрос с помощью powershell, вы, вероятно, уже подозреваете, что это так. В этом случае вам может повезти, потому что, похоже, существует реализация powershell для Mac.
@user1934428 user1934428 спасибо, сэр, да, я действительно ссылался на эту ссылку, чтобы установить Powershell. Спасибо за ваш вклад!

Как отмечено в комментариях .cmd (или .bat), файлы — это так называемые пакетные файлы, которые используют язык устаревшей оболочки Windows (он же интерпретатор командной строки), cmd.exe.
Таким образом, вы не можете запускать пакетные файлы на Unix-подобных платформах, таких как macOS.
Однако несложно преобразовать командный файл в сценарий оболочки, понятный POSIX-совместимой оболочке zsh:
Удалить @echo off
Замените rem на #
Удалите set из определений переменных, например set url=YOUR_SEARCH_URL.
Ссылайтесь на переменные с префиксом $, а не заключайте их в %...%; например, используйте $url вместо %url%
Удалите call перед вызовом таких утилит, как curl.
Замените timeout /t 5 /nobreak на sleep 5 (и аналогично для других значений секунд).
Сопоставление фундаментальных функций языка оболочки в cmd.exe, POSIX-совместимых оболочках и PowerShell см. в этом ответе.
Как также отмечается в комментариях, кроссплатформенное решение возможно, учитывая, что версия PowerShell на базе .NET (Core), PowerShell (Core) 7, является кроссплатформенной и работает также на Unix-подобных платформах. .
То есть, если вы напишете свой код в PowerShell и поместите его в файл .ps1, он будет работать на всех поддерживаемых платформах (хотя различия между платформами все равно должны учитываться ситуативно, например, не использовать расширения .exe в вызовах утилит в Unix и для конкретных платформ). переменные среды)
Просто гнида, я бы назвал cmd «оболочкой», просто чтобы быть единообразным в языке, какой инструмент похож на zsh, powershell и т. д.
@mklement0, как всегда совершенно правильный ответ. Я бы рекомендовал ФП игнорировать все, кроме последних двух (2) абзацев. Напишите код один раз в PowerShell и запустите его на всех поддерживаемых платформах. Создание YAMS (Еще один сценарий-мутант) умножает как работу, так и усилия по обслуживанию.
Согласен, @lit, по крайней мере, в долгосрочной перспективе (изучение PowerShell — нетривиальная задача, хотя, как мы оба знаем, в конечном итоге оно того стоит); спасибо за приятный отзыв.
Я просмотрел ответ, на который вы (mklement0) меня направили, и теперь мой скрипт работает! Я столкнулся с новыми проблемами, не связанными с публикацией (это мой момент «добро пожаловать в мир обучения программированию»), но сценарий работает, потому что я получаю новое сообщение об ошибке в моей оболочке zsh с надписью «curl: ( 3) URL-адрес отклонен: неправильное имя хоста». это подсказывает мне, что у меня проблемы с IAM с моим API... Я получил ошибку HTTP 403, поэтому я обновил свой ресурс API до разрешений уровня администратора (я знаю, что это неразумно, это временно) и все еще не мог получить URL-адрес для загрузки - теперь я получаю ошибку HTTP 401. Я разберусь с этим! Спасибо!
И для ясности я воспользовался вашим мнением о переводе моего пакетного файла в сценарий оболочки и запустил его как файл «.sh». Я действительно ссылался на связанный ответ для сопоставления фундаментального языка оболочки и переписал сценарий в Powershell, используя переменные среды и локальные переменные, но я сделал это после того, как мой мозг был поджарен, и я вспомнил, что сценарий больше не проблематичен, но делает мой доступ к сценарию/вызов API с разрешения стал новой проблемой. Как я уже сказал, ваше решение сработало! Я только что наткнулся на новую проблему, отдельную от исходного заданного вопроса.
Этот файл .cmd предназначен специально для Windows. Он выполняется интерпретатором командной строки Windows. Это не сценарий PowerShell, так что это не поможет. Ничто из этого (кроме ECHO) не совместимо с Mac.