Powershell -Recurse参数;如何排除特定的子目录

时间:2017-01-01 05:29:07

标签: powershell

我有一个powershell脚本,可以在将文件从dev复制到根文件夹后更改文件扩展名等。我已经成功复制了这些文件。但是,我在使用-Recurse(适用于所有子文件夹(我想要排除dev文件夹))或仅将代码应用于eoot文件夹之间陷入困境。

CODE:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command "$w = $args[0];foreach ($file in Get-ChildItem -Recurse -Path "$w" -Exclude *.bat, *.txt, *.png, *.jpg, *.jpeg, *.gif, *.mp3, *.mp4, dev\\*) {"$w+$file";(Get-Content $w$file).replace('dev/', '') | Set-Content "$w$file";(Get-Content $w$file).replace('.min.js', '.minjs') | Set-Content "$w$file";(Get-Content $w$file).replace('.json', '.xson') | Set-Content "$w$file";(Get-Content $w$file).replace('https://www.google-analytics.com/analytics.js', '/httpswgacanalyticsjs/') | Set-Content "$w$file";(Get-Content $w$file).replace('.js', '.min.js') | Set-Content "$w$file";(Get-Content $w$file).replace('.minjs', '.min.js') | Set-Content "$w$file";(Get-Content $w$file).replace('.xson', '.json') | Set-Content "$w$file";(Get-Content $w$file).replace('/httpswgacanalyticsjs/', 'https://www.google-analytics.com/analytics.js') | Set-Content "$w$file";(Get-Content $w$file).replace('.min.css', '.mincss') | Set-Content "$w$file";(Get-Content $w$file).replace('.css', '.min.css') | Set-Content "$w$file";(Get-Content $w$file).replace('.mincss', '.min.css') | Set-Content "$w$file";};Write-Host ".""" "%path%"

INPUT:

FOLDER
    -> dev
        ->files
        ->folders 

输出:

FOLDER
    -> dev        //exclude
        ->files   //exclude
        ->folders //exclude
    ->files //execute code on this
        ->folders //execute code on this

2 个答案:

答案 0 :(得分:0)

我没有对此进行过测试,所以我完全偏离了理论,但以下内容可能会对我所理解的内容有所帮助。

添加如下内容:

$filesToRecurse = Get-ChildItem -Path {pathToFileToRecurse} -Exclude {pathToFolderToExclude} | where {! $_.PSIsContainer}

然后使用$ filesToRecurse变量来执行重命名的文件列表,因为它不包含您要排除的文件或文件夹。

注意:如果要排除多个位置等,也可以创建和使用数组变量。

答案 1 :(得分:0)

尝试类似这样的东西(PowerShell v5 for use -file选项)

$w = "c:\temp\";
$exclude=@("*.bat", "*.txt", "*.png", "*.jpg", "*.jpeg", "*.gif", "*.mp3", "*.mp4")

$hashreplace = @{}
$hashreplace.'dev/'= ''
$hashreplace.'.min.js'= '.minjs'
$hashreplace.'.json'= '.xson'
$hashreplace.'https://www.google-analytics.com/analytics.js'= '/httpswgacanalyticsjs/'
$hashreplace.'.js'= '.min.js'
$hashreplace.'.minjs'= '.min.js'
$hashreplace.'.xson'= '.json'
$hashreplace.'/httpswgacanalyticsjs/'= 'https://www.google-analytics.com/analytics.js'
$hashreplace.'.min.css'= '.mincss'
$hashreplace.'.css'= '.min.css'
$hashreplace.'.mincss'= '.min.css'

foreach ($file in Get-ChildItem -Recurse -File -Path "$w" -Exclude $exclude | where {$_.fullname -notlike "*\dev\*"}) 
{
    $text=(Get-Content $file.FullName)
    $hashreplace.Keys | %{ $text = $text.Replace($_, $hashreplace[$_])}
    $text | set-content $file.FullName 
};