【问题标题】:Batch file output without path/directory in front of the commands命令前面没有路径/目录的批处理文件输出
【发布时间】:2021-02-04 09:46:36
【问题描述】:

所以,正如标题所说,如果我将批处理文件输出到文本文件中,我想删除放在被调用命令前面的目录或路径。

例如,我有一个这样的批处理文件

call :sub>log.txt
    
:sub
SET ip=127.0.0.1
ping %ip%

我得到的输出是这样的:

C:\Users\...>SET ip=127.0.0.1     
C:\Users...>ping 127.0.0.1 
pingoutput

我想要的是这个:

SET ip=127.0.0.1
ping 127.0.0.1
pingoutput

前面的路径对于深层目录可能会很烦人。 上面的例子就是这样,例子。我想创建一个批处理文件来安装一个sql数据库和不同的触发器和函数,这样我就可以很容易地将它部署在不同的电脑上。

编辑说:@echo off 在开头只是完全删除了一行,甚至是命令本身。

【问题讨论】:

  • 前缀是控制台窗口的提示字符串,可以用prompt command更改。例如,您可以使用prompt $H 来获得一个空提示(实际上$H 代表一个退格字符,但在这里它没有任何作用,虽然它会在您重定向到此类时包含在一个文件中),但我建议不要使用空提示,因为控制台看起来很混乱......
  • 据我所知,使用$H,@aschipfl,我记得它会在输出文件中产生奇怪的字符。这是否在不同版本的 Windows/cmd.exe/notepad.exe 中发生了变化,我无法确认,因此我在回答中只使用了$G。也许$_ 会提供类似的东西,只是它显然会包含一个额外的空行。
  • 你说得对,@Compo,我只是玩了一下,发现(在我的 Windows 7 机器上)prompt $H 产生序列 BS + SPACE + BS (我想这可能是为了在 BS 刚向后移动时真正清除控制台上的前一个字符)。因此,获得空提示文本的唯一剩余可能性是本地磁盘上的$M 和带有空的pushd/popd 缓冲区的$+(都启用了命令扩展),这两者都不太有用说限制/依赖...

标签: batch-file directory path output


【解决方案1】:

@echo off 禁用命令echoing。这有点离题。如果您想查看命令,则在启用@echo offecho 每个命令:

@echo off
call :sub>log.txt
goto :eof
:sub
echo set ip=127.0.0.1 & SET ip=127.0.0.1
echo ping %ip% & ping %ip%

或者如果您不想使用 `& 运算符,则只需换行即可:

@echo off
call :sub>log.txt
goto :eof  
:sub
echo set ip=127.0.0.1
SET ip=127.0.0.1
echo ping %ip%
ping %ip%

并且完全没有标签的calling:

@echo off
(echo set ip=127.0.0.1 & set ip=127.0.0.1
echo ping %ip% & ping %ip%)>log.txt

【讨论】:

  • 只是一个小说明,@echo off 不会禁用命令echoing,echo off 会为当前的cmd.exe 实例禁用echoing,或者直到echo on 再次启用它。 @ 前缀会禁用其后命令的 echoing,在这种情况下,它会阻止命令 echo offechoed。我觉得这是一个重要的区别,因为许多用户似乎认为有一个@echo 命令,而实际上没有。
【解决方案2】:

如果深度路径是您的真正问题,那么您可能没有想到有一个更简单的解决方法。更改prompt 字符串。

@Prompt $G
Call :Sub 1> "log.txt"
@Prompt
GoTo :EOF

:Sub
Set "IP=127.0.0.1"
%__APPDIR__%ping.exe %IP%

在上述情况下,我已将提示字符串更改为大于字符,在调用标签后,使用不带参数的Prompt 将其再次返回到默认值。同样如您所见,@ 字符前缀会关闭这些命令的回显,因此它们不会显示在您的控制台或输出文件中。

在上面的示例中,我使用了$G,因为它仍然可以区分命令和输出,但您显然可以使用它来找到您喜欢的东西。

要了解有关可用选项的更多信息,请打开命令提示符窗口,键入 prompt /?,按 ENTER 键,然后阅读显示的信息。

【讨论】:

  • 您还应该注意到,在我上面的代码中,我包含了一个GoTo :EOF 指令,它可以防止命令解析器再次退回到标签中。 (您可以选择将其更改为不同的实际标签,甚至将其替换为Exit /B
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 2022-01-06
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
相关资源
最近更新 更多