【问题标题】:nonexistent pipe bat file不存在的管道bat文件
【发布时间】:2021-04-28 13:48:22
【问题描述】:

我正在尝试创建一个用于格式化磁盘的 .bat 文件。每次我运行脚本时它都不起作用,并说它正在尝试写入一个不存在的管道。我还没有找到任何明显的原因为什么它不起作用。我在其他任何地方也没有找到答案。 这是代码

:loop
echo list disk|diskpart|find "Online"
set "disk=."
set /p "disk=Pick disk number above to destroy/reformat: "
echo.
echo list disk|diskpart|find "Disk %disk%"
if errorlevel 1 (
 echo Invalid drive selection!
 pause
 goto :loop
) else (
 echo select Disk %disk%
 echo clean
 echo create partition primary
 echo select partition=1
 echo active
 echo format fs=fat32
 echo assign
 echo exit
)| REM diskpart
pause

【问题讨论】:

  • 我建议您永远不要尝试使用批处理文件执行破坏性任务。我不会,而且我已经编写批处理文件超过 30 年了。我还强烈建议您在使用该输入之前,在没有实施一些非常强大的输入验证之前,不要将set /p 用于最终用户输入。在set /p 提示符下,最终用户可以输入任何内容,(在这种情况下将作为. 传递),或任何内容,包括毒字符和恶意代码,(这可能会关闭您的脚本,或造成无法估量的损害).
  • 没有办法知道我会去测试一个使用diskpart 的脚本。我建议您的第一步是准确定位不存在的管道被引用的位置(嗯......仔细寻找不存在的东西,begorrah......)那么 - 它是否到达if?如果是这样,请尝试将rem diskpart 替换为|sort|more 等无害的东西。我对else 块中的pause 命令不太满意...
  • 查看您的代码,26 行的管道没有问题,所以我认为您的问题与最后一行的管道有关。
  • @Magoo 我更改了 rem diskpart 进行排序,它按预期进行并且排序没有问题。一旦我将磁盘部分放回原处,问题就会再次出现。哦,是的,它确实达到了 if。
  • @JesseMäenpää,我发布了一个答案,然后注意到您已经编辑了代码以使其无效。现在请测试您当前发布的代码,并报告您的问题是否已经解决。我怀疑它有。 顺便说一句,您不需要同时删除它们!

标签: batch-file batch-processing


【解决方案1】:

我假设您的问题与 pause 命令有关,您在 exit 编辑后尝试通过管道传输到 diskpart

由于某种原因,您现在删除了两个 pause 命令,所以您的问题现在应该已经消失了。

您应该能够通过这个非破坏性示例重新创建问题:

@(  echo exit
    pause)|diskpart
@timeout -1

最简单的解决方法是将错误消息重定向到 NUl 设备:

@(  echo exit
    pause 2>nul)|diskpart
@timeout -1

【讨论】:

  • 问题仍在发生。删除暂停没有任何作用。
  • 第一点,上面的第一个例子,确实重现了你的错误,而第二点没有。我看不出对原因有任何疑问。此外,我和其他人绝对无意运行您提供的代码,无论是否使用pause 命令@JesseMäenpää。因此,获得帮助的最佳方法是从您的代码中删除任何 echo off,然后将脚本的整个输出粘贴到您的问题中,(格式化为代码),这样我们就可以看到每个使用的命令和这样做的输出。
【解决方案2】:

原来我是个白痴。

我刚刚删除了rem,现在它可以工作了。

所以现在的代码是:

:loop
echo list disk|diskpart|find "Online"
set "disk=."
set /p "disk=Pick disk number above to destroy/reformat: "
echo.
echo list disk|diskpart|find "Disk %disk%"
if errorlevel 1 (
echo Invalid drive selection!
pause
goto :loop
) else (
 echo select Disk %disk%
 echo clean
 echo create partition primary
 echo select partition=1
 echo active
 echo format fs=fat32
 echo assign
 echo exit
)|diskpart
pause

【讨论】:

  • 您是认真地告诉我们,您插入REM 并不是为了防止他人破坏他们的数据吗?出现这种情况的唯一原因是如果您只是从其他地方复制代码,而原作者知道它增加了一定程度的安全性。无论如何,尝试输入您最初发布问题时的pause,就像我开始输入答案时一样,您将收到相同的错误消息,正如我的答案所示。我很高兴你把它整理好了,但我真的不敢相信你真的在你的实际代码中使用了 REM
猜你喜欢
  • 2019-08-27
  • 2012-12-27
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
相关资源
最近更新 更多