Кілька каталогів: еквівалент 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
@ Mr.Kennedy Пара речей. Спробуйте запустити git addта побачити, що він повертається - майте на увазі, що $_всередині foreach є лише кожен окремий запис масиву останнього елемента конвеєра (це означає, що commitкрок у вашому прикладі не отримає необроблених чисел, тому додавання chще раз, ймовірно, неправильне ). Крім того, у вашому прикладі коміти виконуватимуться лише (?) Після того, як всі додавання будуть виконані, а це означає, що перша фіксація отримає все ... Крім того, ви можете використовувати кілька висловлювань (розділених на ;) всередині одного кроку передбачення.
Боб

22

Вам не потрібно викликати mkdir кілька разів, тому що це New-Itemможе мати масив шляхів. Наприклад:

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

@DavidPostill пояснив більшість понять у своїй відповіді . Це також використовує перевагу інтерполяції рядків замість явного конкатенації. Крім того, %скорочення використовується замість ForEach-Object, але має таке ж значення.

На жаль, не представляється простим способом інтерполяції рядка в масив рядків, як у bash.


2
@DavidPostill Ви пояснили набагато детальніше, ніж я. Це може бути додатковим доповненням до вашої відповіді: P
Боб

2
@DavidPostill, будь ласка, не видаляйте це - ваше пояснення дуже корисне
Містер Кеннеді,

3
Версія з максимальним полем для гольфу:md(0..9|%{"ch$_"})
Ben N

2
@DavidPostill md- це стандартний псевдонім для mkdir, який є функцією PowerShell. %, як згадував Боб, це стандартний псевдонім для ForEach-Object. Двійкові котирування рядків інтерполюють змінні, тому "ch$_"еквівалентні 'ch' + $_. Ви можете шукати псевдонім, виконавши Get-Command( gcm) на ньому.
Бен N

1
@ Mr.Kennedy Щось на кшталт: 1..9 | %{"ch$_"} | %{git add "$_"; git commit -m "$_"}або 1..9 | %{$name = "ch$_"; git add "$name"; git commit -m "$name"}. Ці коментарі зараз надто довгі, тому якщо у вас є додаткові запитання, будь ласка, задайте їх як запитання або, можливо, перейдіть до чату.
Боб

1

Я б використав для версії циклу, оскільки її легко запам'ятати і її можна застосувати у багатьох ситуаціях. Навіть його можна використовувати для декількох команд.

Для еквівалента цієї команди bash:

для i в {1..9}; робити
mkdir ch $ я
зробив

... у використанні PowerShell:

for($i=1;
$i -le 10;
$i++)
{md ch$i}

mamum, не могли б ви уточнити - я отримую помилку, коли запускаю ваш код із командного рядка PowerShell або, як скрипт ps1: Missing opening '(' after keyword 'for'.Ця команда: foreach ($i in 1..9) {md ch$i}отримує мені нумеровані каталоги "ch" apter, але я не розумію вашого "для. ..; зробіть ... зробили "петлю.
Містер Кеннеді

Цикл for, який я тут використав, використовується для bash shell (/ bin / sh). Я завжди міняю свою оболонку, щоб бити, як я звик до цієї оболонки. Для ps, ви повинні використовувати інший синтаксис для циклу (див. Додане посилання ss64.com/ps/for.html )
Осман Мамун,

1
PowerShell: for($i=1; $i -le 10; $i++){md ch$i}дякую мамун, але я ще не "Борн знову ...";) (і я не знаю C ++, але я думаю, я сортую розумію, що таке "$ i-le" (якщо менше або дорівнює?) І "$ i ++" (~ "i + = 1"?) означають і роблять у команді ...
Містер Кеннеді,

1
Так, аргумент може читати як для (ініціалізувати i з 1; до тих пір, поки я менше або дорівнює 1; збільшити i на 1) {зробіть ітеративні речі}
Осман Мамун,

1

Створіть декілька каталогів під поточним каталогом:

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

Вищенаведене є короткою версією наступного. Зауважте, що ат-знак входить перед масивом рядків та використання названих параметрів:

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

І якщо ви хочете пройти весь шлях, повна нативна команда буде:

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

Під час використання командного рядка PowerShell я використовую коротку версію.

Коли я пишу сценарій, особливо один для інших (хто може бути новим для PowerShell), я схильний писати повну команду.

Виберіть те, що найкраще підходить для вас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.