使用 start cmd /k 和 doskey 的 windows bat 文件不起作用

发布于 2025-01-09 01:50:51 字数 230 浏览 0 评论 0原文

我尝试将 start cmd 与自定义 doskey 文件一起使用,但失败了。

1.doskey

ls=dir /b $1

start "title" cmd.exe /k doskey /macrofile=1.doskey && ls .

提示

ls 命令无法识别

I tried to use start cmd with custom doskey file, but failed.

1.doskey

ls=dir /b $1

start "title" cmd.exe /k doskey /macrofile=1.doskey && ls .

Prompted

ls command is not recognized

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ゝ杯具 2025-01-16 01:50:51

两个问题:

问题 1

&& 将由您运行此命令的 shell 解释,而不是窗口中的 shell,因此您正在运行 doskey /macrofile=1.doskey 在新窗口中,但 ls . 在旧窗口中。

解决方案是用双引号将应传递到新窗口的整个命令括起来:

start "title" cmd.exe /k "doskey /macrofile=1.doskey && ls ."

或者,您可以使用 ^ 转义两个 & 字符:

start "title" cmd.exe /k doskey /macrofile=1.doskey ^&^& ls .

...但是,这只会发现问题 2,所以请继续阅读。

问题 2

您可以从 中推断出(某种程度上) DOSKEY 文档,您无法从未手动输入的命令运行宏(毕竟,DOSKEY 是一个处理来自计算机的交互式输入的工具用户):

要运行宏,请在命令提示符下从第一个位置开始键入宏名称。如果宏是使用 $* 或任何批处理参数 $1 到 $9 定义的,请使用空格分隔参数。 您无法从批处理程序运行 doskey 宏。

(强调我的。)

这仅讨论批处理文件,但它适用于输入命令并将其传递给 cmd /ccmd /k 是其中之一(因为您没有在新 shell 中键入命令,所以它会在 shell 启动时自动运行)。

根据您描述意图的方式(“使用自定义 doskey 文件开始”),我假设您添加 ls . 只是为了测试它是否有效。在这种情况下,只需删除整个 && ls . 部分并在新窗口中手动尝试 ls . ,您会发现它确实有效!

如果这不是您想要的,并且您实际上打算从“cmd /k”命令行或批处理文件运行 DOSKEY 宏,那么您就不走运了 - 相反,您可以调用包含函数的批处理文件并使用它,或创建自定义批处理文件而不是宏。

Two issues:

Issue 1

The && will be interpreted by the shell you run this command from and not the shell in the window, so you are running doskey /macrofile=1.doskey in the new window but ls . in the old one.

The solution is to surround the whole command that should be passed to the new window with doublequotes:

start "title" cmd.exe /k "doskey /macrofile=1.doskey && ls ."

Alternatively you could escape both & characters with ^:

start "title" cmd.exe /k doskey /macrofile=1.doskey ^&^& ls .

...however, this will just uncover issue 2, so keep reading.

Issue 2

As you can deduce (sort of) from the DOSKEY docs, you cannot run a macro from a command that you didn't type in manually (after all, DOSKEY is a tool to process interactive input from a user):

To run a macro, type the macro name at the command prompt, starting at the first position. If the macro was defined with $* or any of the batch parameters $1 through $9, use a space to separate the parameters. You cannot run a doskey macro from a batch program.

(Emphasis mine.)

This talks only about batch files, but it applies to any non-interactive way of entering a command - and passing it to cmd /c or cmd /k is one of them (since you aren't typing the command into the new shell, it's run automatically on startup of the shell instead).

Based on how you described your intent ("use start with custom doskey file"), I assume you added the ls . only to test whether it works. In that case, just remove the whole && ls . part and try ls . manually in the new window, and you'll see that it does work!

In case that's not what you wanted, and you actually intended to run DOSKEY macros from that "cmd /k" command line or a batch file, you are out of luck - instead, you could call a batch file that contains functions and use that, or create custom batch files instead of macros.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文