批处理/VBS混合解决方案

批处理/VBS混合解决方案

我有一个名为 Export.txt 的纯文本文件。它包含一个地理位置列表,前面是 3 位数字,前面有前导零。

例子

--START OF FILE--
001 Aberdeen
002 Bellevue
003 Camas
004 Davenport
005 Edgewood
006 Ferndale
007 George
008 Harrington
009 Ilwaco
010 Kahlotus
--END OF FILE--

我如何编写一个脚本或批处理文件来读取文件中的每一行并在 NTFS 分区的给定位置上创建具有此名称的文件夹?

笔记!请注意文件夹名称必须包含数字。将上面的列表视为实际的文件夹列表。

更新!我实际要创建的文件夹列表有 245 个,范围从 001 到 245。以下是前几行。

--START OF FILE--
001 Harberget
002 Långflon
003 Källegrafsrös
004 Badstuknappen
005 Aspberget
006 Knipen
007 Halsjön
008 N Finnskoga
009 Båtstad
010 Tisjön
.
.
.
.

245 Milskär
--END OF FILE--

完整列表如下:http://pastebin.com/SNde4bBN

Martin提供的PS脚本是不工作处理 Å、Ä 和 Ö 等字符时效果很好。它只创建了文本文件中总共 245 个文件夹中的 116 个。它会跳过包含其中一个字符的每一行。因此,它会跳过002 Långflon003 Källegrafsrös,但会创建001 Harberget004 Badstuknappen

答案1

这是一个可以执行您想要的操作的 Powershell 脚本。

$folder="X:\Test";             # Directory to place the new folders in.
$txtFile="X:\Test\Export.txt"; # File with list of new folder-names
$pattern="\d+.+";              # Pattern that lines must match      


get-content $txtFile | %{

    if($_ -match $pattern)
    {
        mkdir "$folder\$_";
    }
}

这将包括名称中的数字。

要运行脚本,请执行以下操作。

  1. 以管理员身份运行 Powershell。
  2. 输入Set-ExecutionPolicy RemoteSigned并按 Enter 以启用脚本运行。出现提示时按 Y。
  3. 关闭 Powershell。
  4. 将上面的脚本复制并粘贴到 Notepad 或 Notepad++ 中。
  5. 将其替换X:\Test为您想要创建新文件夹的位置的绝对路径。
  6. 将其替换X:\Test\Export.txt为包含要用于这些文件夹的名称的文本文件的绝对路径。
  7. \d+.+用行必须匹配的模式 替换。\d+匹配任何数字.+即可匹配任何字符。
  8. 将其另存为“FileName.ps1”或任何您想要的名称。只需确保保留.ps1扩展名。
  9. 打开 Windows 资源管理器并转到保存 ps1 文件的位置。右键单击它并选择“使用 Powershell 运行”。

截图...

A b C d

答案2

批处理/VBS混合解决方案

已在 Windows XP SP3、Vista SP2 和 Windows 7 SP1 上测试。这是一个专门制作的批处理脚本,其中嵌入了 VB 脚本,可执行实际工作。这样,您便可获得一个脚本,应该与 XP SP2 之后发布的任何操作系统兼容。主要归功于杰布德本汉姆他提出(并改进)了这里使用的混合技术。

REM^ &@echo off>nul
REM^ &if "%~2" == "" exit /b 2
REM^ &pushd "%~2"
REM^ &cscript //e:vbscript //nologo "%~f0" "%~1"
REM^ &popd
REM^ &exit /b

Dim stream, text, lines, fso
Set stream = CreateObject("ADODB.Stream")
stream.Open
stream.Type = 2
stream.Charset = "utf-8"
stream.LoadFromFile Wscript.Arguments(0)
text = stream.ReadText
stream.Close

lines = Split(text, vbCrLf)
Set fso = CreateObject("Scripting.FileSystemObject")

For i = 0 To UBound(lines)
fso.CreateFolder(lines(i))
Next

指示

  1. 将上面的脚本复制并粘贴到记事本或任何其他纯文本编辑器(例如 Notepad++)中。

  2. 将其另存为CreateFolders.cmd或任何您想要的名称。只需确保保留.cmd扩展名。

  3. 打开命令提示符并导航到保存文件的文件夹:

    cd /d "X:\Folder\containing\CreateFolders.cmd"
    
  4. 通过分别指定列表文件和目标文件夹作为第一个和第二个参数来运行批处理脚本:

    CreateFolders.cmd "X:\Some\folder\Export.txt" "X:\Destination\folder"
    

截图

b C

参考


PowerShell 解决方案

以下 PowerShell 脚本复制了上述解决方案。它接受两个参数,第一个是列表文件(假定保存为 UTF-8),第二个是目标文件夹。已使用 Windows XP SP3、Vista SP2 和 Windows 7 SP1 进行测试。

笔记Windows PowerShell 2.0 与 Windows 7 捆绑在一起,但需要在 XP/Vista 中手动安装。对于 Windows XP,您需要安装 .NET Framework 2.0 SP1/SP2,或 .NET Framework 3.5 SP1(其中包含 .NET Framework 2.0 SP2)。Windows 8 和 Windows 8.1 分别包含 PowerShell 3.0 和 4.0。

if ($args.Count -gt 1)
{
    $file=$args[0];
    $dest=$args[1];
    Get-Content $file -Encoding UTF8 | %{ md "$dest\$_" >$null; }
}

指示

  1. 将上面的脚本复制并粘贴到记事本或任何其他纯文本编辑器(例如 Notepad++)中。

  2. 将其保存为CreateFolders.ps1(或任何其他名称,只要保留正确的扩展名)。

  3. 要运行该脚本,您可以启动 PowerShell,然后执行以下操作之一:

    • 导航到实际路径,然后执行:

      cd "C:\Some folder"
      & ".\CreateFolders.ps1" "X:\Some\folder\Export.txt" "X:\Destination\folder"
      
    • 直接指定完整路径来执行:

      & "C:\Some folder\CreateFolders.ps1" "X:\Some\folder\Export.txt" "X:\Destination\folder"
      

    &是个呼叫接线员

    或者,您可以从常规命令提示符启动它:

    powershell -ExecutionPolicy Bypass -NoLogo -NoProfile -File "C:\Some folder\CreateFolders.ps1" "X:\Some\folder\Export.txt" "X:\Destination\folder"
    

参考


以前的(某种可行的)解决方案

警告!请勿使用它们除非你事先知道目标系统和你正在处理的数据。如果您仍想这样做,请确保它们能够按预期工作。

批处理脚本

以下脚本将循环遍历列表文件的所有行并创建尽可能多的文件夹,并以实际行内容命名。该脚本接受两个参数:第一个是存储列表的路径,该路径被硬编码为Export.txt(可以随意输入不同的文件名,但要避免空格);后者是目标文件夹。

@echo off
setlocal

REM make sure there are enough parameters
if "%~2" == "" exit /b 2

REM set the working directory
pushd "%~1"

REM loop through the list and create the folders
for /f "delims=" %%G in (Export.txt) do (md "%~2\%%~G")

REM restore the working directory and exit
popd
endlocal & exit /b

已知限制

  • 仅限 ASCII 或 ANSI 输入文件。

批处理脚本 - 备用 UTF-8 版本

此脚本与上面的脚本类似,但在这种情况下,文本文件不是直接读取的,而是通过type命令输出进行解析。chcp首先需要将编码更改为 UTF-8。在这种情况下,列表不是硬编码的,但必须作为第一个参数的一部分指定。第二个参数是目标文件夹。

@echo off
setlocal

REM make sure there are enough parameters
if "%~2" == "" exit /b 2

REM set the working directory
pushd "%~2"

REM set the list file
set file="%~1"

REM set the encoding to UTF-8
chcp 65001 >nul

REM loop through the list and create the folders
for /f "delims=" %%G in ('type %file%') do (md "%%~G")

REM restore the working directory and exit
popd
endlocal & exit /b

已知限制

  • 在英语区域设置中,该chcp 65001命令将停止批处理脚本的执行,从而跳过任何其他命令。

相关内容