5

У меня есть простой текстовый файл с именем Export.txt. Он содержит список географических мест, которому предшествует трехзначное число с ведущими нулями.

пример

--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

Сценарий PS, предоставленный Мартином, плохо работает с такими персонажами, как Å, Ä и Ö. Он создает только 116 папок из 245 найденных в текстовом файле. Он пропускает каждую строку, содержащую один из этих символов. Так, например, он пропускает 002 Långflon и 003 Källegrafsrös , но создает 001 Harberget Harberget и 004 Badstuknappen .

2 ответа2

7

Вот скрипт 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. Скопируйте и вставьте скрипт выше в Блокнот или Блокнот ++.
  5. Замените X:\Test абсолютным путем к месту, где вы хотите создать новые папки.
  6. Замените X:\Test\Export.txt абсолютным путем к текстовому файлу, содержащему имена, которые вы хотите использовать для этих папок.
  7. Замените \d+.+ Шаблоном, которому должны соответствовать линии. \d+ соответствует любому числу .+ соответствует любому символу.
  8. Сохраните его как «FileName.ps1» или как хотите. Просто убедитесь, что у вас есть расширение .ps1 .
  9. Откройте проводник Windows и перейдите в папку, где вы сохранили файл ps1. Щелкните правой кнопкой мыши по нему и выберите "Запуск с Powershell".

Скриншоты ...

a б с d

5

Пакетный / VBS гибридный раствор

Протестировано с Windows XP SP3, Vista SP2 и Windows 7 SP1. Это специально созданный пакетный скрипт со встроенным скриптом VB, который выполняет реальную работу. Таким образом, вы получаете скрипт, который должен быть совместим с любой операционной системой, выпущенной после XP SP2. Основная заслуга в этом Джеб и dbenham , которые придумали (и рафинированный) гибридную технику , используемую здесь.

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. Скопируйте и вставьте скрипт выше в Блокнот или любой другой текстовый редактор (например, Блокнот ++).

  2. Сохраните его как CreateFolders.cmd или как хотите. Просто убедитесь, что у вас есть расширение .cmd .

  3. Откройте командную строку и перейдите к папке, в которой вы сохранили файл:

    cd /d "X:\Folder\containing\CreateFolders.cmd"
    
  4. Запустите пакетный скрипт, указав файл списка и папку назначения в качестве первого и второго параметра соответственно:

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

Скриншоты

б с

Рекомендации


Решение 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. Скопируйте и вставьте скрипт выше в Блокнот или любой другой текстовый редактор (например, Блокнот ++).

  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 остановит выполнение пакетного скрипта, пропуская, таким образом, любую другую команду.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .