Visual studio 编写脚本以搜索解决方案

Visual studio 编写脚本以搜索解决方案,visual-studio,powershell,batch-file,visual-studio-2013,full-text-search,Visual Studio,Powershell,Batch File,Visual Studio 2013,Full Text Search,我正在从我们的网站上删除大量旧的和未使用的图片。我们使用C#代码隐藏运行ASP.NET,并在Visual Studio(2013)中完成我们的工作。现在我只是浏览一下我们的图像目录,然后搜索图像文件名的解决方案。虽然我们有一些文件名遵循一种模式,并且可以使用regex在一个组中完成,但这仍然相当乏味。是否有一种方法可以编写一个批处理脚本(或任何东西)来搜索此目录中每个文件的解决方案?我可以想象像这样的伪代码 for file in images_directory if file not

我正在从我们的网站上删除大量旧的和未使用的图片。我们使用C#代码隐藏运行ASP.NET,并在Visual Studio(2013)中完成我们的工作。现在我只是浏览一下我们的图像目录,然后搜索图像文件名的解决方案。虽然我们有一些文件名遵循一种模式,并且可以使用regex在一个组中完成,但这仍然相当乏味。是否有一种方法可以编写一个批处理脚本(或任何东西)来搜索此目录中每个文件的解决方案?我可以想象像这样的伪代码

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

总之,如果我理解正确,您首先要从目录中获取所有图像文件。使用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
    }
}

唯一的问题是,您需要确保文件名没有机会匹配文件中的其他位置,从而产生误报。

在解决方案文件中,查找对.csproj文件的所有引用。在每个.csproj文件中,查找所有包含行。在每个包含的文件中,查找包含图像引用的所有行。将每个相关行复制到临时列表中。这将使搜索速度比为每个图像多次搜索每个.cs文件更快

对于每个图形文件,使用
findstr
在临时列表中对
/\bfilename\b/i
执行regexp搜索。如果未找到,请使用启动将孤立映像移动到备份

使用.bat扩展名保存此文件,将前三行
set
修改为适当的值,并对其进行快照。默认情况下,它只是假装移动。如果您确信模拟将产生正确的结果,请从底部附近的
move
行中删除
echo
,以释放脚本的束缚

@echo关闭
setlocal
设置“image\u dir=c:\path\to\images”
设置“sln\u file=c:\path\to\solution\Project1.sln”
设置“backup\u dir=c:\path\to\backup”
设置“记住=%temp%\proj_images.txt”
对于%%I in(“%sln\u file%”)执行pushd“%%~dpI”
rem/.sln->.csproj->.cs->图像。查找图像引用并记住。
删除“%memory%”>NUL 2>NUL
对于/f“delims=“%%I in('findstr/I.csproj\>”“%sln_file%”)do(
rem//%%I包含与/.csproj\b/ig匹配的行
对于(%%I)中的%%p,如果存在请执行“%%~p”(
rem/%%%p包含一个.csproj文件名
对于/f“delims=“%%J in('findstr/i“\”“%%~p”)do(
rem//%%J包含与/\b包括\b/ig匹配的行
对于(%%J)中的%%c,如果存在请执行“%%~c”(
rem//%%c包含包含的文件名
findstr/i“%.png\>.jpg\>.gif\>.bmp\>.tif\>”%%~c“>>%membere%”和(
%%~nxc中引用的回显图像。我会记住这一点。
)
)
)
)
)
rem//用于图像目录中的每个图像文件(递归)
对于(*.png*.jpg*.gif*.bmp*.tif)中的/r“%image\u dir%”%%I,请执行以下操作(
/\bfilename.ext\b/i的rem//regexp测试
findstr/i“\”“%memory%”numl|(
rem//findstr的非零退出状态表示未找到
echo%%~nxI未被解决方案项目中包含的任何文件引用。
雷姆//*********************************************************
rem//从下一行中删除“ECHO”以启用移动
雷姆//*********************************************************
回显移动“%%~fI”“%backup\u dir%”
)
)
删除“%memory%”>NUL 2>NUL
按任意键退出。
暂停>NUL

这就是你的想法吗?

是的——使用Powershell。批处理对于这类事情来说是非常困难的,尽管它可以批处理完成,但其他人将不得不编写它,而你(和我)可能不会从中学到任何东西,因为它太迟钝了。使用Powershell几乎可以做任何事情,而且学习起来相当容易。你可能可以通过谷歌搜索“Powershell查找文件并移动它”来找到一个Powershell脚本来实现这一点。@TonyHinkle是的,我可以做很多。我的主要问题是,当你说解决方案是指.sln还是.csproj文件时,如何使用批处理或PowerShell搜索解决方案?换句话说,您正在检查该文件是否包含在项目中?我很确定我指的是.sln文件。一般来说,我所做的是对每个文件名使用
Ctrl+Shift+F
搜索解决方案,我想使用批处理或powershell脚本完成同样的任务。在powershell中,您可以尝试通过执行$fileContent=Get Content'project.sln'| Out string来获取字符串形式的文件,然后对于文件目录$fileContent-match$filenameRegex或$fileContent-like“*$filename*”中的文件,这告诉我没有使用任何图像,这不是真的。请在您的.csproj文件上尝试,因为通常会在此处列出包含的文件。我已经测试了我自己的项目。2个文件没有列在.csproj文件中,而且当我打开项目时,确实没有列在解决方案资源管理器中。我的所有文件都列在解决方案资源管理器中-它们只是从未在任何实际文件中使用过。csproj文件保存了项目中包含的所有文件,您将在解决方案中看到这些文件探索者如果用记事本打开它,您将看到xml标记,如。因为.csproj文件包含所有包含文件的信息。如果在visual studio之外进行更改,则不会更新该文件。因此,如果您未通过visual studio移动文件,解决方案资源管理器仍会将其显示为已包含,因为.csproj仍会列出该文件,并且它不知道该文件已被移动。因此,如果该文件在html文件中的任何位置使用,此操作是否会实际进行搜索?因为所有的东西都已经包含在我的项目中了——我正在删除那些不必要的东西(由于没有被使用)