Vários diretórios: equivalente do PowerShell a "mkdir dir {1..9}"?

11

Qual é a sintaxe para criar vários diretórios com o PowerShells md (ou mkdir, New-Item ...) equivalente ao comando 'nix, mkdir ch{1..9}ou seja,

~/parent_dir/  
ch1/  
ch2/  
ch3/  
ch4/  
ch5/  
ch6/  
ch7/  
ch8/  
ch9/  

Procurei nas páginas de manual e na ajuda de exemplos, mas não conheço a sintaxe do PowerShell para fazer uma coisa tão simples. Obrigado.

Sr. Kennedy
fonte

Respostas:

16

Qual é a sintaxe para criar vários diretórios com o PowerShell

Use o seguinte comando:

0..9 | foreach $_{ New-Item -ItemType directory -Name $("ch" + $_) }

Como funciona:

  • 0..9o operador range .. gera a sequência dos números 0, 1, ... 9
  • os números são canalizados | para o próximo comando
  • foreach loops (através de cada número, por sua vez)
  • { ... }é um bloco de script
  • New-Item -ItemType directory -Name $("ch" + $_) cria os diretórios
  • $_é uma variável automática que representa o objeto atual no pipeline (o número)

Exemplo:

> 0..9 | foreach $_{ New-Item -ItemType directory -Name $("ch" + $_) }


    Directory: F:\test


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       25/09/2016     14:57                ch0
d-----       25/09/2016     14:57                ch1
d-----       25/09/2016     14:57                ch2
d-----       25/09/2016     14:57                ch3
d-----       25/09/2016     14:57                ch4
d-----       25/09/2016     14:57                ch5
d-----       25/09/2016     14:57                ch6
d-----       25/09/2016     14:57                ch7
d-----       25/09/2016     14:57                ch8
d-----       25/09/2016     14:57                ch9
DavidPostill
fonte
3
Não há nada menos detalhado do que inserir o seguinte 1..9 | % $_{ md -name $("ch" + $_) }:?
Sr. Kennedy,
1
Acho que sim. Mas não sou especialista em PowerShell.
DavidPostill
1
Parece OK, mas eu sugiro que você experimentá-lo e ver :)
DavidPostill
1
a-HA - entendi 1..9 | % $_{ mv ch$_*.* ch$_ }:: ^ D
Sr. Kennedy
1
@ Mr.Kennedy Algumas coisas. Você deve tentar executar o git adde ver o que ele retorna - lembre-se de que $_dentro de um foreach há apenas cada entrada de matriz individual do último item do pipeline (o que significa que a commitetapa do seu exemplo não terá números brutos, portanto, adicionar chnovamente provavelmente está errado ) Além disso, no seu exemplo, as confirmações somente (?) Seriam executadas após a conclusão de todas as inclusões, o que significa que a primeira confirmação obteria tudo ... Como alternativa, você pode usar várias instruções (separadas por ;) dentro de uma única etapa foreach.
Bob
22

Você não precisa invocar o mkdir várias vezes, pois New-Itempode seguir uma variedade de caminhos. Por exemplo:

mkdir $(1..9 | %{"ch$_"})

@DavidPostill explicou a maioria dos conceitos em sua resposta . Isso também aproveita a interpolação de cadeias em vez de executar uma concatenação explícita. Além disso, a %abreviação é usada em vez de ForEach-Object, mas tem o mesmo significado.

Infelizmente, não parece haver uma maneira fácil de interpolar uma string em uma matriz de strings, como no bash.

Prumo
fonte
2
@DavidPostill Você explicou em muito mais detalhes que eu. Isso pode ser mais um adendo à sua resposta: P
Bob
2
@DavidPostill agradar não excluí-lo - a sua explicação é muito útil
Mr. Kennedy
3
Versão máxima do golfe:md(0..9|%{"ch$_"})
Ben N
2
@DavidPostill mdé um alias padrão para mkdir, que é uma função do PowerShell. %, como Bob mencionou, é um alias padrão para ForEach-Object. Seqüências de caracteres entre aspas duplas interpolam variáveis, portanto, "ch$_"é equivalente a 'ch' + $_. Você pode procurar um alias executando Get-Command( gcm) nele.
Ben N
1
@ Mr.Kennedy Algo como: 1..9 | %{"ch$_"} | %{git add "$_"; git commit -m "$_"}ou 1..9 | %{$name = "ch$_"; git add "$name"; git commit -m "$name"}. Esses comentários estão demorando um pouco agora, então se você tiver mais perguntas, faça-as como perguntas ou talvez entre no bate-papo.
Bob
1

Eu usaria para a versão em loop, pois é fácil de lembrar e pode ser aplicado a muitas situações. Mesmo ele pode ser usado para vários comandos.

Para um equivalente a este comando bash:

para i em {1..9}; fazer
mkdir ch $ i
feito

... no PowerShell, use:

for($i=1;
$i -le 10;
$i++)
{md ch$i}
Osman Mamun
fonte
mamum, você poderia esclarecer - eu recebo um erro quando executo seu código na linha de comando do PowerShell ou, como um script ps1: Missing opening '(' after keyword 'for'.Este comando: foreach ($i in 1..9) {md ch$i}recebe os diretórios "ch" apter numerados, mas não entendo o seu "para". ..; do ... done "loop.
Mr. Kennedy
O loop for que usei aqui é para o shell bash (/ bin / sh). Eu sempre mudo meu shell para bash, pois estou acostumado a esse shell. Para ps, você tem que usar uma sintaxe diferente para loop (consulte o link anexado ss64.com/ps/for.html )
Osman Mamun
1
PowerShell: for($i=1; $i -le 10; $i++){md ch$i}obrigado mamun, mas ainda não sou "Bourne de novo ...";) (nem conheço C ++, mas acho que devo entender o que "$ i-le" (se for menor ou igual a?) E "$ i ++" (~ "i + = 1"?) média e estão fazendo no comando ...
Mr. Kennedy
1
Sim, o argumento ca ser lido como for (inicializar i a partir de 1; enquanto i menor ou igual a 1; aumente i em 1) {fazer coisas de forma iterativa}
Osman Mamun
1

Crie vários diretórios abaixo do diretório atual:

mkdir ('abc','def','jkl') 

A descrição acima é uma versão abreviada do seguinte. Observe o sinal de arroba incluído na frente da matriz de strings e o uso dos parâmetros nomeados:

mkdir -Path @('abc','def','jkl')

E se você quiser ir até o fim, o comando nativo completo seria:

New-Item -Path @('abc','def','jkl') -ItemType Directory

Ao usar a linha de comando do PowerShell, uso a versão curta.

Ao escrever um script, especialmente um para outros (que podem ser novos no PowerShell), costumo escrever o comando nativo completo.

Escolha o que funciona melhor para você.

fpm
fonte