How to copy a whole directory recursively with an npm script on Windows 10 Powershell?

和自甴很熟 提交于 2021-01-28 12:02:15

问题


How to copy a whole directory recursively with an npm script on Windows 10 Powershell?

Right now I have the following tree:

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

What I want is a script that when run in dir 1 it goes to dir 2 and copies the whole dir src recursively from there to dir 1. So in the end I would have a similar src in 1 as there is in 2.

When I cd to the directory 1 and run npm run build:ui which is defined in package.json as

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

it starts doing kind of what I want but not quite; it copies stuff from directory 2 to 1. The problem is it doesn't copy the whole directory with all of its subdirectories and all the possible contents, instead it just copies the files from directly inside 2/src/. In other words, here's what the tree looks like after the operation:

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

So only the file asd.txt got copied.

Other configurations I have tried without success include:

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

...none of which are even valid.


回答1:


Consider utilizing the xcopy command instead of copy as it better suits your requirement.

Redefine your build:ui script in the scripts section of your package.json file as follows:

Scripts section of package.json:

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

Running:

When you cd to the directory named 1, (i.e. the directory that contains the package.json with the aforementioned build:ui script defined in it), and then run:

npm run build:ui

it will produce the resultant directory structure:

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

As you can see, the src folder inside folder 2, and all of it's contents, has been copied to folder 1.


Explanation:

The following provides a detailed breakdown of the aforementioned xcopy command:

Options:

  • /e - Copy folders and subfolders, including empty folders.
  • /h - Copy hidden and system files and folders.
  • /y - Suppress prompt to confirm overwriting a file.
  • /q - Do not display file names while copying.

Notes:

  • Each pathname has been encased in JSON escaped double quotes, i.e. \"...\"

  • The ./src\\ part has a trailing backslash (\), which has been JSON escaped (\\), to inform xcopy that the destination is a directory. This also ensures the src directory is created if it doesn't already exist.

  • The > nul 2>&1 part suppresses the confirmation log that states how many files were copied.


Related information:

It's worth noting that on Windows npm utilizes cmd.exe as the default shell for running npm scripts - regardless of the CLI tool you're using, e.g. PowerShell. You can verify this by utilizing the npm-config command to check the script-shell setting. For instance run the following command:

npm config get script-shell

Edit:

If you want your resultant directory structure to be like this:

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

This time the contents of the src folder inside the folder named 2 has been copied to folder 1 - but not the actual containing src folder itself.

Then you need to define your npm script as follows:

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

Note: the destination path has been changed from \"./src\\\" to \".\".




回答2:


For something like this, I might use an approach similar to the below.

Modify your NPM script (build:ui) to call a Powershell script(build.ui.ps1) that is located in the same dir as the package.json file.

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

Create the aforementioned Powershell script with the following contents.

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

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


Run the npm script
npm run build:ui



来源:https://stackoverflow.com/questions/61539374/how-to-copy-a-whole-directory-recursively-with-an-npm-script-on-windows-10-power

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!