Несколько каталогов: эквивалент PowerShell для «mkdir dir {1..9}»?

11

Каков синтаксис для создания нескольких каталогов с PowerShells md (или mkdir, New-Item ...), эквивалентных команде 'nix, mkdir ch{1..9}т.е.

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

Я просмотрел справочные страницы и примеры получения справки, но я не знаю синтаксиса для PowerShell, чтобы сделать такую ​​простую вещь. Спасибо.

Мистер Кеннеди
источник

Ответы:

16

Какой синтаксис для создания нескольких каталогов с PowerShell

Используйте следующую команду:

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

Как это устроено:

Пример:

> 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
ДэвидПостилл
источник
3
Там нет ничего менее многословным , чем войти в следующее: 1..9 | % $_{ md -name $("ch" + $_) }?
г-н Кеннеди
1
Я думаю так. Но я не эксперт по PowerShell.
DavidPostill
1
Это выглядит хорошо, но я предлагаю вам попробовать и посмотреть :)
DavidPostill
1
a-HA - получил это:: 1..9 | % $_{ mv ch$_*.* ch$_ }^ D
Мистер Кеннеди
1
@ Мистер Кеннеди Пара вещей. Вы должны попробовать запустить git addи посмотреть, что он возвращает - имейте в виду, что $_внутри foreach есть только каждая отдельная запись массива последнего элемента конвейера (что означает, что commitшаг в вашем примере не получит необработанные числа, поэтому добавление chснова, вероятно, неправильно ). Также, в вашем примере, коммиты будут (?) Выполняться только после того, как все добавления будут сделаны, что означает, что первый коммит получит все ... В качестве альтернативы, вы можете использовать несколько операторов (разделенных ;) внутри одного шага foreach.
Боб
22

Вам не нужно вызывать mkdir несколько раз, потому что вы New-Itemможете использовать массив путей. Например:

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

@DavidPostill объяснил большинство понятий в своем ответе . Это также использует преимущества интерполяции строк вместо явной конкатенации. Кроме того, %вместо этого используется сокращение ForEach-Object, но оно имеет то же значение.

К сожалению, не представляется простым способом интерполировать строку в массив строк, как в bash.

боб
источник
2
@DavidPostill Вы объяснили гораздо более подробно, чем я. Это может быть больше дополнением к вашему ответу: P
Боб
2
@DavidPostill, пожалуйста, не удаляйте его - ваше объяснение очень полезно
г-н Кеннеди
3
Максимально гольф-версия:md(0..9|%{"ch$_"})
Бен Н
2
@DavidPostill md- это стандартный псевдоним для mkdir, который является функцией PowerShell. %как упоминал Боб, это стандартный псевдоним для ForEach-Object. Строки в двойных кавычках интерполируют переменные, поэтому "ch$_"эквивалентны 'ch' + $_. Вы можете найти псевдоним, запустив на нем Get-Command( gcm).
Бен Н
1
@ Mr.Kennedy Что-то вроде: 1..9 | %{"ch$_"} | %{git add "$_"; git commit -m "$_"}или 1..9 | %{$name = "ch$_"; git add "$name"; git commit -m "$name"}. Эти комментарии становятся немного длиннее, поэтому, если у вас есть дополнительные вопросы - пожалуйста, задавайте их как вопросы, или, возможно, загляните в чат.
Боб
1

Я хотел бы использовать для версии цикла, так как это легко запомнить и может применяться во многих ситуациях. Даже это может быть использовано для нескольких команд.

Для эквивалента этой команды bash:

для меня в {1..9}; сделать
MKDIR CH $ я
сделал

... в использовании PowerShell:

for($i=1;
$i -le 10;
$i++)
{md ch$i}
Осман Мамун
источник
Мам, не могли бы вы уточнить - я получаю сообщение об ошибке, когда запускаю ваш код из командной строки PowerShell или как сценарий ps1: Missing opening '(' after keyword 'for'.Эта команда: foreach ($i in 1..9) {md ch$i}возвращает мне пронумерованные каталоги apter ch, но я не понимаю ваши. ..; сделать ... готово "цикл.
г-н Кеннеди
Я использовал цикл for для оболочки bash (/ bin / sh). Я всегда меняю свою оболочку на bash, так как я привык к этой оболочке. Для PS вы должны использовать другой синтаксис для цикла for (см. Прикрепленную ссылку ss64.com/ps/for.html )
Осман Мамун,
1
PowerShell: for($i=1; $i -le 10; $i++){md ch$i}спасибо, мамон, но я еще не «Bourne again ...»;) (и я не знаю C ++, но мне кажется, что я понимаю, что такое «$ i-le» (если меньше или равно?) И «$ i ++» (~ «i + = 1»?) означает и делает в команде ...
Мистер Кеннеди,
1
Да, аргумент может быть прочитан как для (инициализировать i от 1; до тех пор, пока i меньше или равен 1; увеличить i на 1) {делать вещи итеративно}
Осман Мамун
1

Создайте несколько каталогов под текущим каталогом:

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

Выше приведена сокращенная версия следующего. Обратите внимание на знак at, включенный перед массивом строк, и использование именованных параметров:

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

И если вы хотите пройти весь путь, полная нативная команда будет:

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

При использовании командной строки PowerShell я использую короткую версию.

При написании сценария, особенно одного для других (которые могут быть новичками в PowerShell), я склонен писать полную встроенную команду.

Выберите то, что работает лучше для вас.

FPM
источник