Как рекурсивно скопировать весь каталог с помощью скрипта npm на Windows 10 Powershell? - PullRequest
1 голос
/ 01 мая 2020

Как рекурсивно скопировать весь каталог с помощью сценария npm на Windows 10 Powershell?

Сейчас у меня есть следующее дерево:

test
├───1
│       package.json
│
└───2
    └───src
        │   asd.txt
        │
        └───asd
                asd - Copy (2).txt
                asd - Copy.txt
                asd.txt

То, что я хочу, это скрипт, который при запуске в dir 1 переходит в dir 2 и рекурсивно копирует весь каталог dir src в dir 1. Так что, в конце концов, у меня будет src в 1 аналогично 2.

Когда я cd в каталог 1 и запусту npm run build:ui, который определен в package.json как

"scripts": {
    "build:ui": "cd ..\\2 && copy src ..\\1"
}

начинает делать то, что я хочу, но не совсем; он копирует данные из каталога 2 в 1. Проблема в том, что он не копирует весь каталог со всеми его подкаталогами и всем возможным содержимым, а просто копирует файлы прямо из 2/src/. Другими словами, вот как выглядит дерево после операции:

test
├───1
│       asd.txt
│       package.json
│
└───2
    └───src
        │   asd.txt
        │
        └───asd
                asd - Copy (2).txt
                asd - Copy.txt
                asd.txt

Итак, скопирован только файл asd.txt.

Другие конфигурации, которые я пробовал без успеха, включают:

"scripts": {
    "build:ui": "cd ..\\2 && copy -r src ..\\1"
}
"scripts": {
    "build:ui": "cd ..\\2 && Copy-Item -Recursive src ..\\1"
}
"scripts": {
    "build:ui": "cd ..\\2 && cp -r src ..\\1"
}

... ни один из которых не является действительным.

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Попробуйте использовать команду xcopy вместо copy, поскольку она лучше соответствует вашим требованиям.

Переопределите сценарий build:ui в scripts раздел вашего пакета. json файл выглядит следующим образом:

сценарий пакета. json:

"scripts": {
  "build:ui": "xcopy /e/h/y/q \"../2/src\" \"./src\\\" > nul 2>&1"
}

Запуск:

Когда вы cd обращаетесь к каталогу с именем 1 (то есть к каталогу, содержащему пакет . json с вышеупомянутым build:ui определенный в нем сценарий), а затем запустите:

npm run build:ui

, в результате чего будет получена структура каталогов:

test
├── 1
│   ├── package.json
│   └── src
│       ├── asd
│       │   ├── asd - Copy (2).txt
│       │   ├── asd - Copy.txt
│       │   └── asd.txt
│       └── asd.txt
└── 2
    └── src
        ├── asd
        │   ├── asd - Copy (2).txt
        │   ├── asd - Copy.txt
        │   └── asd.txt
        └── asd.txt

Как видите, папка src внутри папки 2 и все его содержимое было скопировано в папку 1.


Объяснение:

Ниже приведено подробное описание вышеупомянутой команды xcopy:

Параметры:

  • /e - копировать папки и подпапки, включая пустые папки.
  • /h - копировать скрытые и системные файлы и папки.
  • /y - подавлять запрос на подтверждение перезаписи файл.
  • /q - Не отображать имена файлов при копировании.

Примечания:

  • Каждое имя пути заключено в JSON двойные кавычки, т. Е. \"...\"

  • Часть ./src\\ имеет конечную обратную косую черту sh (\), которая была JSON сбежал (\\), чтобы сообщить xcopy, что местом назначения является каталог. Это также гарантирует, что каталог src создается, если он еще не существует.

  • Часть > nul 2>&1 подавляет журнал подтверждения, в котором указано, сколько файлов было скопировано.


Информация, связанная с данной:

Стоит отметить, что на Windows npm используется cmd.exe в качестве оболочки по умолчанию для запуска сценариев npm - независимо от Инструмент CLI, который вы используете, например, PowerShell . В этом можно убедиться, используя команду npm -config , чтобы проверить настройку script-shell . Например, выполните следующую команду:

npm config get script-shell

Редактировать:

Если вы хотите, чтобы ваша результирующая структура каталогов была такой:

test
├── 1
│   ├── asd
│   │   ├── asd - Copy (2).txt
│   │   ├── asd - Copy.txt
│   │   └── asd.txt
│   ├── asd.txt
│   └── package.json
└── 2
    └── src
        ├── asd
        │   ├── asd - Copy (2).txt
        │   ├── asd - Copy.txt
        │   └── asd.txt
        └── asd.txt

На этот раз содержимое папки src внутри папки с именем 2 было скопировано в папку 1, но не содержит саму папку, содержащую src.

Затем необходимо определить npm Сценарий выглядит следующим образом:

"scripts": {
  "build:ui": "xcopy /e/h/y/q \"../2/src\" \".\" > nul 2>&1"
}

Примечание: путь назначения был изменен с \"./src\\\" на \".\".

0 голосов
/ 01 мая 2020

Для чего-то подобного, я мог бы использовать подход, аналогичный приведенному ниже.

Измените ваш NPM скрипт (build:ui), чтобы он вызывал скрипт Powershell (build.ui.ps1 ), который находится в том же каталоге, что и файл пакета. json.

"scripts": {
    "build:ui": "@powershell -NoProfile -ExecutionPolicy Unrestricted -Command ./build.ui.ps1"
},

Создайте вышеупомянутый скрипт Powershell со следующим содержимым.

param(
    $srcParentDir = '2',
    $srcDir = 'src',
    $srcDestDir = '1'
)

Set-Location (get-item $PSScriptRoot).parent.FullName
Copy-Item -Path "$srcParentDir\$srcDir" -Destination $srcDestDir -Recurse


Запустите скрипт npm
npm run build:ui

...