问题
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 informxcopy
that the destination is a directory. This also ensures thesrc
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 scriptnpm run build:ui
来源:https://stackoverflow.com/questions/61539374/how-to-copy-a-whole-directory-recursively-with-an-npm-script-on-windows-10-power