Como criar várias pastas e nomeá-las lendo linhas do arquivo de texto?

5

Eu tenho um arquivo de texto simples chamado Export.txt. Ele contém uma lista de lugares geográficos, precedidos por um número de 3 dígitos com zeros à esquerda.

Exemplo

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

Como posso escrever um script ou arquivo em lote que leia cada linha do arquivo e crie uma pasta com esse nome em um determinado local de uma partição NTFS?

Nota! Por favor, note que os nomes das pastas devem incluir os dígitos. Pense na lista acima como a lista real de pastas.

Atualização! Minha lista real de pastas para criar é 245, variando de 001 a 245. Aqui estão as primeiras linhas.

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

A lista completa pode ser encontrada aqui: link

O script PS fornecido por Martin é não funciona bem com personagens como Å, Ä e Ö. Ele cria apenas 116 pastas do total de 245 encontradas no arquivo de texto. Ele pula todas as linhas que incluam um desses caracteres. Por isso, pula 002 Långflon e 003 Källegrafsrös , por exemplo, mas cria 001 Harberget e 004 Badstuknappen .

    
por Samir 27.02.2014 / 14:47

2 respostas

7

Aqui está um script do Powershell que faz o que você quer.

$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\$_";
    }
}

Isso incluirá os dígitos no nome.

Para executar o script, faça o seguinte.

  1. Execute o Powershell como administrador.
  2. Digite Set-ExecutionPolicy RemoteSigned e pressione Enter para ativar execução de scripts. Pressione Y quando solicitado.
  3. Feche o Powershell.
  4. Copie e cole o script acima no Bloco de notas ou no Notepad ++.
  5. Substitua X:\Test pelo caminho absoluto até o local onde você quer criar suas novas pastas.
  6. Substitua X:\Test\Export.txt pelo caminho absoluto para o arquivo de texto que contém os nomes que você deseja usar para essas pastas.
  7. Substitua \d+.+ pelo padrão que as linhas devem corresponder. \d+ corresponde a qualquer número .+ corresponde a qualquer caractere.
  8. Salve como "FileName.ps1" ou qualquer outro nome que você queira. Apenas certifique-se para manter a extensão .ps1 .
  9. Abra o Windows Explorer e vá para o local em que você salvou seu arquivo ps1. Clique com o botão direito e selecione "Run with Powershell".

Screenshots ...

    
por 27.02.2014 / 15:07
5

Solução híbrida em lote / VBS

Testado com o Windows XP SP3, o Vista SP2 e o Windows 7 SP1. É um script em lote especialmente criado com um Script VB incorporado que faz o trabalho real. Dessa forma, você obtém um script que deve ser compatível com qualquer sistema operacional lançado após o XP SP2. O principal crédito vai para jeb e dbenham que inventam (e refinam) a técnica híbrida usada aqui.

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

Instruções

  1. Copie e cole o script acima no Bloco de notas ou em qualquer outro editor de texto simples (por exemplo, o Notepad ++).

  2. Salve como CreateFolders.cmd ou qualquer outro nome que você queira. Apenas certifique-se de manter a extensão .cmd .

  3. Abra um prompt de comando e navegue até a pasta em que você salvou o arquivo:

    cd /d "X:\Folder\containing\CreateFolders.cmd"
    
  4. Execute o script em lote especificando o arquivo de lista e a pasta de destino como o primeiro e o segundo parâmetro, respectivamente:

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

Screenshots

Referências

Solução do PowerShell

O seguinte script do PowerShell replica a solução acima. Ele aceita dois parâmetros, sendo o primeiro o arquivo de lista (que é considerado como sendo salvo como UTF-8) e o segundo é a pasta de destino. Testado com o Windows XP SP3, o Vista SP2 e o Windows 7 SP1.

Observação O Windows PowerShell 2.0 é fornecido com o Windows 7, mas precisa ser instalado manualmente no XP / Vista. Quanto ao Windows XP, você precisa ter o .NET Framework 2.0 SP1 / SP2 instalado ou o .NET Framework 3.5 SP1, que inclui o .NET Framework 2.0 SP2. O Windows 8 e o Windows 8.1 incluem o PowerShell 3.0 e 4.0, respectivamente.

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

Instruções

  1. Copie e cole o script acima no Bloco de notas ou em qualquer outro editor de texto simples (por exemplo, o Notepad ++).

  2. Salve como CreateFolders.ps1 (ou qualquer outro nome, desde que você mantenha a extensão correta).

  3. Para executar o script, você pode iniciar o PowerShell e, em seguida:

    • Navegue até o caminho real e execute-o:

      cd "C:\Some folder"
      & ".\CreateFolders.ps1" "X:\Some\folder\Export.txt" "X:\Destination\folder"
      
    • Execute-o especificando o caminho completo diretamente:

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

    & é o operador de chamadas .

    Como alternativa, você pode iniciá-lo a partir de um prompt de comando normal:

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

Referências

Soluções anteriores (tipo de trabalho)

Atenção! Não os use a menos que você saiba antecipadamente o sistema alvo e os dados com os quais está lidando. Se você ainda quiser, verifique se eles funcionam conforme o esperado.

Script em lote

O script a seguir percorrerá todas as linhas do arquivo de lista e criará tantas pastas, nomeando-as depois do conteúdo real da linha. O script aceita dois parâmetros: o primeiro é o caminho onde a lista é armazenada, que é codificada como Export.txt (sinta-se livre para colocar um nome de arquivo diferente, mas evite espaços); a última é a pasta de destino.

@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

Limitações conhecidas

  • Apenas arquivos de entrada ASCII ou ANSI.

Script em lote - versão alternativa do UTF-8

Este script é semelhante ao acima, mas neste caso o arquivo de texto não é lido diretamente, mas analisado através da saída do comando type . O chcp é necessário primeiro para alterar a codificação para UTF-8. Nesse caso, a lista não é codificada, mas precisa ser especificada como parte do primeiro parâmetro. O segundo parâmetro é a pasta de destino.

@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

Limitações conhecidas

  • Em localidades em inglês, o comando chcp 65001 interromperá a execução do script em lote, ignorando qualquer outro comando.
por 27.02.2014 / 15:31