有没有办法在 zsh shell (Mac/Unix) 上从 .cmd 文件执行命令

问题描述 投票:0回答:1

我位于尝试执行的文件的目录中,并且我知道我正在使用正确的文本来执行位于正确位置的文件。该文件名为“modify-search.cmd”,我正在执行:

./modify-search.cmd

但是,因为 zsh 只能识别“echo”,所以“.cmd”文件中的其他命令无法被识别,因此我的 zsh shell 状态为“未找到命令”。这是我的

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 代码完成所有这些工作。此外,我在 Visual Studio 代码上安装了 Powershell 扩展,但也无法让它在那里工作。激活 Powershell(通过 zsh)后,我尝试执行:

command ./modify-search.cmd

该命令为我提供了与 zsh 上的可执行命令相同的输出 - 'echo' 语句有效,并且每个其他命令都返回“未找到命令”。

我完成实验练习的低效解决方法是直接在“.cmd”代码中插入我的 URL 和管理密钥,无论我的文件有:

%url%%admin_key%

并直接通过我的 zsh shell(插入我的 Azure CLI)执行调用,这在我上次遇到此问题时有效。

这是我第二次遇到这个问题,所以我想我应该寻求帮助,这样我才能有一个更有效的解决方案。请帮忙,有人吗?

编辑:更新,我的解决方法这次不起作用!上次我在这些指定部分之间执行 Azure CLI 命令并替换我的身份验证数据以连接到我的帐户。这次,我正在执行 POST 和 PUT 语句,但它的工作方式不一样。我得到以下输出:

zsh: no matches found: %url%/skillsets/margies-skillset?api-version=2020-06-30

Edit2:好的,我正在尝试使用 VS Code 调用 REST API,你们中的一些人可能已经从

modify-search.cmd
的代码中注意到了这一点。我正在做一些与之相关的研究,这可能会引导我找到解决方案。到目前为止,我已经:

  1. 为我的 IDE、VS Code 安装 REST 客户端扩展

  2. 制作了一个不带扩展名的单独的“.rest”文件(以便文本文件之后可以将代码更改为“.rest”文件)。

我尝试发送请求,但收到

getaddrinfo ENOTFOUND echo
错误...进度

macos powershell cmd zsh azure-cli
1个回答
0
投票

如评论中所述

.cmd
(或
.bat
)文件是所谓的 批处理文件,使用旧版 Windows 命令行解释器的语言,
cmd.exe

因此,您无法在类 Unix 平台(例如 macOS)上运行批处理文件。

但是,将批处理文件转换为 POSIX 兼容的

zsh
shell 可以理解的 shell 脚本并不难:

  • 删除

    @echo off

  • rem
    替换为
    #

  • 从变量定义中删除

    set 
    ,例如
    set url=YOUR_SEARCH_URL

  • 引用带有前缀

    $
    的变量,而不是将它们括在
    %...%
    中;例如,使用
    $url
    代替
    %url%

  • 在调用

    call 
     等实用程序之前删除 
    curl

  • timeout /t 5 /nobreak
    替换为
    sleep 5
    (对于其他秒值也类似)。

有关

cmd.exe
、POSIX 兼容 shell 和 PowerShell 中基本 shell 语言功能的并置,请参阅此答案


正如评论中所指出的,跨平台解决方案是可能的,因为基于 .NET (Core) 的 PowerShell 版本,PowerShell (Core) 7,是跨平台的并且在类 Unix 上运行也有平台。

也就是说,如果您在 PowerShell 中编写代码并将其放入

.ps1
文件中,它将在所有受支持的平台上运行(尽管在情况下仍必须尊重平台差异,例如在实用程序调用中不使用
.exe
扩展) Unix 和特定于平台的环境变量)

© www.soinside.com 2019 - 2024. All rights reserved.