我正在努力从我们的网站上删除大量旧的和未使用的图像。我们使用C#代码运行ASP.NET,并使用Visual Studio(2013)完成我们的工作。现在我只是浏览我们的images目录并在解决方案中搜索图像文件名。虽然我们有一些遵循模式的文件名,并且可以使用正则表达式在一个组中完成,但这仍然相当繁琐。有没有办法可以编写批处理脚本(或任何东西)来搜索此目录中每个文件的解决方案?我可以想象伪代码如
for file in images_directory
if file not in solution
delete file
但这可能吗?
从技术上讲,我们只是将文件移动到另一个文件夹中是安全的,所以我猜实际的伪代码更像是
for file in images_directory
if file not in solution
move file to backup_directory
答案 0 :(得分:2)
在解决方案文件中,查找对.csproj文件的所有引用。在每个.csproj文件中,找到所有包含行。在每个包含的文件中,查找包含图像引用的所有行。将每个相关行复制到临时列表。这将使搜索速度比为每个图像多次搜索每个.cs文件更快。
对于每个图形文件,使用findstr
在临时列表中对/\bfilename\b/i
执行正则表达式搜索。如果未找到,请使用conditional execution启动将孤立映像移动到备份。
使用.bat扩展名保存,将前三行set
行修改为适当的值,然后尝试一下。默认情况下,它只是假装移动。如果您对模拟产生的结果感到满意,请从底部附近的echo
行中移除move
,让脚本脱离其皮带。
@echo off
setlocal
set "image_dir=c:\path\to\images"
set "sln_file=c:\path\to\solution\Project1.sln"
set "backup_dir=c:\path\to\backup"
set "remember=%temp%\proj_images.txt"
for %%I in ("%sln_file%") do pushd "%%~dpI"
rem // .sln -> .csproj -> .cs -> images. Find image references and remember.
del "%remember%" >NUL 2>NUL
for /f "delims=" %%I in ('findstr /i ".csproj\>" "%sln_file%"') do (
rem // %%I contains lines matching /.csproj\b/ig
for %%p in (%%I) do if exist "%%~p" (
rem // %%p contains a .csproj filename
for /f "delims=" %%J in ('findstr /i "\<include\>" "%%~p"') do (
rem // %%J contains lines matching /\binclude\b/ig
for %%c in (%%J) do if exist "%%~c" (
rem // %%c contains the filename of an include
findstr /i ".png\> .jpg\> .gif\> .bmp\> .tif\>" "%%~c" >>"%remember%" && (
echo Images referenced within %%~nxc. I'll remember this.
)
)
)
)
)
rem // for each image file in image_dir (recursive)
for /r "%image_dir%" %%I in (*.png *.jpg *.gif *.bmp *.tif) do (
rem // regexp test for /\bfilename.ext\b/i
findstr /i "\<%%~nxI\>" "%remember%" >NUL || (
rem // non-zero exit status of findstr means not found
echo %%~nxI is not referenced by any files included in the solution's projects.
rem // *********************************************************
rem // REMOVE "ECHO" FROM THE FOLLOWING LINE TO ENABLE THE MOVES
rem // *********************************************************
echo move "%%~fI" "%backup_dir%"
)
)
del "%remember%" >NUL 2>NUL
echo Press any key to exit.
pause >NUL
这是你的想法吗?
答案 1 :(得分:0)
一起如果我理解正确您首先要从目录中获取所有图像文件。使用PowerShell:
$imageFiles = Get-ChildItem 'path/to/image/directory' -Recurse | Where-Object { !($_.PSIsContainer) }
这会抓取除目录之外的所有文件。然后:
$solutionText = Get-Content 'path/to/solution/file.csproj' | Out-String
ForEach ($file in $imageFiles ) {
if ($solutionText -match $file.Name) {
# Move to another folder
}
}
唯一的问题是,您需要确保文件名没有机会在文件的其他位置进行匹配,从而产生误报。