Command line 用于运行DiskPart的批处理文件

Command line 用于运行DiskPart的批处理文件,command-line,command,Command Line,Command,我正在尝试开发一个批处理文件,以便在尝试删除所有分区时运行并删除Windows 7中的隐藏分区。通常我会在命令提示符窗口中逐行执行此操作,但我正试图找出如何创建批处理文件以运行并加快此过程 下面是我在命令提示符下键入的行 disk part Rescan List Disk Select Disk 3 List Partition Select Partition 3 Delete Partition Override 我已经创建了一个BAT文件,但只能让第一个命令工作 将您的diskpart

我正在尝试开发一个批处理文件,以便在尝试删除所有分区时运行并删除Windows 7中的隐藏分区。通常我会在命令提示符窗口中逐行执行此操作,但我正试图找出如何创建批处理文件以运行并加快此过程

下面是我在命令提示符下键入的行

disk part
Rescan
List Disk
Select Disk 3
List Partition
Select Partition 3
Delete Partition Override

我已经创建了一个BAT文件,但只能让第一个命令工作

将您的diskpart命令(键入
diskpart
后键入的命令)放入类似
script.txt
的文本文件中,并使用以下命令调用diskpart

@echo off
diskpart /s script.txt
但要非常小心,确保您的命令正确且经过良好测试,不要调用批处理文件diskpart


有关更多信息,请参见此处:

我在搜索如何向diskpart脚本文件添加注释时点击此处。后来发现可以使用REM命令添加注释

REM This script is to build to do so and so.
sel disk 0
sel part 1
...

所以,嘿,我知道我来晚了,但我一直在忙着Diskpart和脚本编写等我想做的一些后期成像的事情,尽管这不是你确切问题的直接解决方案,但还是要通读一遍,我敢打赌你可以把这些混在你需要做的事情中:(是的,它非常混乱。我不在乎。它是作为一个文件存在的,不需要外部文件,并且会在它自己之后进行清理。)

扩展卷的REM脚本-无论卷配置如何,都会选择正确的卷 REM成像后的卷大小将始终为39GB,这就是它的关键所在 雷姆 REM当使用固定脚本运行DISKPART不起作用时,此脚本成为必需的 由于磁盘配置不同,每台机器的REM 雷姆 雷姆:它不漂亮,但它完成了工作,并且自己清理干净了 雷姆 2016年4月27日 雷姆 @回音 @CLS 雷姆 REM获取卷的列表并导出到文本文件,以通过DISKPART作为脚本运行 回显列表卷>>C:\VOLLIST.TXT 雷姆 REM使用DISKPART以脚本形式运行文本文件,然后将结果导出到新文本文件 DISKPART/S C:\VOLLIST.TXT>>C:\VOLTEMP.TXT 雷姆 REM删除我们创建的第一个文本文件 DEL C:\VOLLIST.TXT 雷姆 REM获取卷列表并使用FIND命令获取所需的卷(根据需要修改) REM然后使用令牌/DELIMS获取您想要的卷号 REM并创建另一个包含最终脚本的文本文件,以扩展所需的卷 对于/F“TOKENS=2 DELIMS=“%%A IN('TYPE C:\VOLTEMP.TXT^ | FIND/I”39 GB'),请回送选择卷%%A>>C:\VOLEXT.TXT 雷姆 REM删除第二个文本文件 DEL C:\VOLTEMP.TXT 雷姆 REM将其他DISKPART命令附加到最终文本文件 ECHO扩展>>C:\VOLEXT.TXT 雷姆 REM将其他DISKPART命令附加到最终文本文件 回声退出>>C:\VOLEXT.TXT 雷姆 REM使用最终文本文件作为脚本运行DISKPART DISKPART/S C:\VOLEXT.TXT 雷姆 REM删除最后一个文本文件,以便在脚本执行后不会留下任何内容 DEL C:\VOLEXT.TXT 雷姆 REM暂停,以便您可以查看是否有任何失败,并希望在哪里 @停顿
这真的很容易,但当我看到其他人的答案时,我会想“为什么要用简单的方法去做,而你却可以用困难的方法去做”:D

好的,diskpart是终端应用程序,这意味着它有自己的CLI(commandlineiINTERFACE)。这意味着,如果要向diskpart写入命令,必须将其作为stdin(standard input)写入diskpart自己的CLI。这就是您无法通过批处理文件编写命令的原因,因为您的diskpart命令将在diskpart退出后作为cmd.exe的下一个命令运行

现在,我们只需对diskpart“撒谎”,并在其CLI中模拟stdin

我们可以这样做:

(echo Rescan
echo List Disk
echo Select Disk 3
echo List Partition
echo Select Partition 3
echo Delete Partition Override
)  | diskpart
pause
因此,上面的代码执行以下操作:

  • echo命令将生成stdout(standard output)。通常,我们的命令行解释器cmd.exe只会在屏幕上打印此stdout。(您可以通过在cmd.exe中只运行带有括号的echo命令

  • 然后,使用管道
    |
    将这些echo命令的stdout重定向到diskpart应用程序中。因此,echo的stdout现在将充当diskpart应用程序的stdin

  • 所以,您运行diskpart,diskpart从echo获得输入,就像它从键盘获得输入一样,当然它是工作的


    这就是全部,简单易行的解决方案!

    从@Msprg的答案中汲取灵感,在PowerShell中使用here字符串可以更轻松地实现这一点

    (@)
    重新扫描
    列表磁盘
    选择磁盘3
    列表分区
    选择分区3
    删除分区覆盖
    "@
    )|磁盘部分)
    
    如果您需要将其放入批处理文件中,则始终可以使用在其他StackOverflow中可以找到的技巧之一直接将其注入,以及

    e、 g

    
    ((@"
    重新扫描
    列表磁盘
    选择磁盘3
    列表分区
    选择分区3
    删除分区覆盖
    "@
    )|磁盘部分)
    
    如果要创建一个进入diskpart的批处理文件,然后exits@EPOColla请准确解释您需要执行的操作-因为完成后,如果脚本命令都正确,上述语法将退出diskpart。我正在尝试设置一个在WinPE中运行的批处理文件。它将是1。在diskpart中执行所有分区操作。然后2.复制并镜像3.使用imagex应用镜像。我使用2中的调用命令运行一切都没有问题。只要我必须在批处理文件中输入diskpart,它就会在完成后退出。我无法继续自动操作。我必须进行第二次手动调用。@EPOColla打开一个新问题并显示您在代码中的操作。Quest是的,我会的。我以前认为我没有足够的时间回答一个问题,但现在我有了。:)这些都是来自单个批处理文件吗?我正在命令提示符下运行此命令,您必须在diskpart中才能使用任何列表卷。
    (echo Rescan
    echo List Disk
    echo Select Disk 3
    echo List Partition
    echo Select Partition 3
    echo Delete Partition Override
    )  | diskpart
    pause