import path from 'path'
import { fileURLToPath } from 'url'
import { dirname } from 'path'
import ExcelJS from 'exceljs'
import Mock from 'mockjs'
function generateRandomPhoneNumber() {
const phoneSegments = ['3', '5', '7', '8'];
const randomSegment = phoneSegments[Math.floor(Math.random() * phoneSegments.length)];
let remainingNumber = '';
for (let i = 0; i < 9; i++) {
remainingNumber += Math.floor(Math.random() * 10);
}
return '1' + randomSegment + remainingNumber;
}
const __dirname = dirname(fileURLToPath(import.meta.url))
const templatePath = path.resolve(__dirname, 'batch-import.xlsx');
const outputPath = path.resolve(__dirname, 'batch-output100.xlsx');
const mockData = []
for (let i = 0; i < 100; i++) {
mockData.push({
name: Mock.Random.cname(),
age: Mock.Random.integer(18, 28),
mobile: generateRandomPhoneNumber(),
email: Mock.Random.string('number', 10, 10 ) + '@qq.com',
joinDate: Mock.Random.date('yyyy-MM-dd'),
remark: 'test' + (i + 1)
})
}
async function main() {
try {
const workbook = new ExcelJS.Workbook();
await workbook.xlsx.readFile(templatePath);
const worksheet = workbook.getWorksheet(1);
const headerRow = worksheet.getRow(1);
headerRow.values = ['姓名', '年龄', '手机', '邮箱', '加入时间', '备注'];
const startRow = 2;
mockData.forEach((item, index) => {
const row = worksheet.getRow(startRow + index);
row.values = [
item.name,
item.age,
item.mobile,
item.email,
item.joinDate,
item.remark,
];
});
await workbook.xlsx.writeFile(outputPath);
console.log(`成功生成文件:${outputPath}`);
} catch (error) {
console.error('生成失败:', error.message);
}
}
main();
const fs = require('fs/promises');
const path = require('path');
const CONFIG = {
targetDir: 'wwd3',
prefix: 'wwd',
};
* 批量重命名文件
*/
async function batchRenameFiles() {
try {
const targetDirPath = path.resolve(__dirname, CONFIG.targetDir);
try {
await fs.access(targetDirPath);
} catch (err) {
console.error(`❌ 错误:目录 "${CONFIG.targetDir}" 不存在于当前路径`);
process.exit(1);
}
const files = await fs.readdir(targetDirPath, { withFileTypes: true });
const fileList = files.filter(file => file.isFile());
if (fileList.length === 0) {
console.log(`ℹ️ 提示:目录 "${CONFIG.targetDir}" 下没有可重命名的文件`);
return;
}
let successCount = 0;
for (const [index, file] of fileList.entries()) {
try {
const oldFilePath = path.join(targetDirPath, file.name);
const fileExt = path.extname(file.name);
const newFileName = CONFIG.prefix + file.name.split('.')[0].slice(-6) + fileExt;
const newFilePath = path.join(targetDirPath, newFileName);
try {
await fs.access(newFilePath);
console.warn(`⚠️ 跳过:新文件名 "${newFileName}" 已存在,原文件 "${file.name}" 未重命名`);
continue;
} catch (err) {
await fs.rename(oldFilePath, newFilePath);
console.log(`✅ 成功:${file.name} → ${newFileName}`);
successCount++;
}
} catch (err) {
console.error(`❌ 失败:重命名 "${file.name}" 时出错 - ${err.message}`);
}
}
console.log('\n📊 重命名完成');
console.log(`总文件数:${fileList.length}`);
console.log(`成功数:${successCount}`);
console.log(`失败数:${fileList.length - successCount}`);
} catch (err) {
console.error(`❌ 程序执行出错:${err.message}`);
}
}
batchRenameFiles();
import path from 'path'
import fs from 'fs'
import { fileURLToPath } from 'url'
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
const srcDir = 'D:\\apro\\haiku\\src'
const destDir = 'D:\\apro\\local-server\\haiku\\src'
if (!fs.existsSync(srcDir)) {
console.error(`源目录不存在: ${srcDir}`)
process.exit(1)
}
fs.mkdirSync(destDir, { recursive: true })
const entries = fs.readdirSync(srcDir, { withFileTypes: true })
if (entries.length === 0) {
console.warn(`源目录为空: ${srcDir}`)
}
for (const entry of entries) {
if (entry.name === '.DS_Store') continue
const src = path.join(srcDir, entry.name)
const dest = path.join(destDir, entry.name)
try {
fs.cpSync(src, dest, { recursive: true })
console.log(`复制: ${src} -> ${dest}`)
} catch (err) {
console.error(`复制失败: ${src} -> ${dest}`, err)
}
}
console.log(`已将 ${srcDir} 的所有内容复制到 ${destDir} ✓`)
import path from 'path'
import fs from 'fs/promises'
import { fileURLToPath } from 'url'
process.stdout._handle?.setBlocking(true)
process.stderr._handle?.setBlocking(true)
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
let srcDir = 'E:\\迅雷下载\\dm\\wwd1'
let destDir = 'E:\\迅雷下载\\dm1\\wwd1'
for (let i = 2; i < process.argv.length; i++) {
const arg = process.argv[i]
if (arg === '--src' && process.argv[i + 1]) {
srcDir = process.argv[i + 1]
i++
} else if (arg === '--dest' && process.argv[i + 1]) {
destDir = process.argv[i + 1]
i++
}
}
* 格式化耗时(毫秒转成 mm分ss秒 格式)
* @param {number} ms - 耗时毫秒数
* @returns {string} 格式化后的耗时字符串(例如:03分45秒)
*/
function formatDuration(ms) {
const minutes = Math.floor(ms / 60000)
const seconds = Math.floor((ms % 60000) / 1000)
return `${minutes.toString().padStart(2, '0')}分${seconds.toString().padStart(2, '0')}秒`
}
* 生成本地时区的时间戳(格式:YYYY-MM-DD HH:mm:ss)
* @returns {string} 本地时间戳字符串
*/
function getLocalTimestamp() {
const date = new Date()
const padZero = (num) => num.toString().padStart(2, '0')
const year = date.getFullYear()
const month = padZero(date.getMonth() + 1)
const day = padZero(date.getDate())
const hours = padZero(date.getHours())
const minutes = padZero(date.getMinutes())
const seconds = padZero(date.getSeconds())
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}
async function copyDirectory() {
const globalStartTime = Date.now()
try {
try {
await fs.access(srcDir)
} catch {
console.error(`[${getLocalTimestamp()}] ❌ 源目录不存在: ${srcDir}`)
process.exit(1)
}
await fs.mkdir(destDir, { recursive: true })
console.log(`[${getLocalTimestamp()}] ✅ 目标目录准备完成: ${destDir}`)
console.log('----------------------------------------')
const entries = await fs.readdir(srcDir, { withFileTypes: true })
if (entries.length === 0) {
console.warn(`[${getLocalTimestamp()}] ⚠️ 源目录为空: ${srcDir}`)
const globalEndTime = Date.now()
console.log(`----------------------------------------`)
console.log(`[${getLocalTimestamp()}] 总耗时: ${formatDuration(globalEndTime - globalStartTime)}`)
return
}
const results = []
const toCopy = entries.filter(entry => entry.name !== '.DS_Store')
let totalFiles = 0
async function countFilesRecursive(entryPath) {
try {
const stat = await fs.stat(entryPath)
if (stat.isDirectory()) {
const children = await fs.readdir(entryPath, { withFileTypes: true })
for (const child of children) {
if (child.name === '.DS_Store') continue
await countFilesRecursive(path.join(entryPath, child.name))
}
} else if (stat.isFile()) {
totalFiles++
}
} catch (err) {
}
}
for (const entry of toCopy) {
await countFilesRecursive(path.join(srcDir, entry.name))
}
let copiedFiles = 0
async function copyRecursiveWithLogging(src, dest) {
const taskStartTime = Date.now()
try {
const stat = await fs.stat(src)
if (stat.isDirectory()) {
await fs.mkdir(dest, { recursive: true })
const children = await fs.readdir(src, { withFileTypes: true })
for (const child of children) {
if (child.name === '.DS_Store') continue
await copyRecursiveWithLogging(path.join(src, child.name), path.join(dest, child.name))
}
} else if (stat.isFile()) {
await fs.copyFile(src, dest)
const taskDuration = Date.now() - taskStartTime
copiedFiles++
console.log(`[${getLocalTimestamp()}] ✅ 已复制文件 [${formatDuration(taskDuration)}] (${copiedFiles}/${totalFiles}) - ${src} -> ${dest}`)
results.push({ success: true, src, dest, duration: taskDuration })
}
} catch (err) {
const taskDuration = Date.now() - taskStartTime
console.error(`[${getLocalTimestamp()}] ❌ 复制失败 [${formatDuration(taskDuration)}] - ${src} -> ${dest}`, err.message)
results.push({ success: false, src, dest, duration: taskDuration, error: err.message })
}
}
const pros = toCopy.map(async entry => {
const src = path.join(srcDir, entry.name)
const dest = path.join(destDir, entry.name)
await fs.mkdir(path.dirname(dest), { recursive: true })
await copyRecursiveWithLogging(src, dest)
})
await Promise.all(pros)
const totalItems = results.length
const successCount = results.filter(r => r.success).length
const failCount = results.filter(r => !r.success).length
const totalTaskDuration = results.reduce((sum, r) => sum + r.duration, 0)
const globalEndTime = Date.now()
const globalDuration = globalEndTime - globalStartTime
console.log('----------------------------------------')
console.log(`[${getLocalTimestamp()}] 📊 复制任务统计报告`)
console.log('----------------------------------------')
console.log(`总项目数: ${totalItems}`)
console.log(`成功: ${successCount} 个`)
console.log(`失败: ${failCount} 个`)
console.log('----------------------------------------')
console.log(`单个任务总耗时(累加): ${formatDuration(totalTaskDuration)}`)
console.log(`程序总耗时(实际运行时间): ${formatDuration(globalDuration)}`)
console.log('----------------------------------------')
console.log(`📁 源目录: ${srcDir}`)
console.log(`📁 目标目录: ${destDir}`)
console.log('----------------------------------------')
} catch (globalErr) {
const globalEndTime = Date.now()
const globalDuration = globalEndTime - globalStartTime
console.error('----------------------------------------')
console.error(`[${getLocalTimestamp()}] ❌ 全局错误 [总耗时: ${formatDuration(globalDuration)}]`, globalErr)
console.error('----------------------------------------')
process.exit(1)
}
}
copyDirectory()
import childProcess from 'child_process'
import fs from 'fs'
const src = './dm/wwd1'
const dest = './dm2/wwd1'
fs.mkdirSync(dest, { recursive: true })
const rsync = childProcess.spawn('rsync', [
'-avz',
'--progress',
'--partial',
'--exclude', '.DS_Store',
src,
dest
], { stdio: 'inherit' })