Windows下次启动时删除文件的原理及应用

Windows 下删除文件、尤其卸载程序时,有时会提示“下次启动时删除”,这是Windows底层提供的一个功能,具体来说是,把要删除的文件路径写到注册表里一个特定位置,下次Windows启动时,会自动检测这个位置里写的文件路径,删除它们。

这个位置在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager

下的 PendingFileRenameOperations ,是一个长文本数据,如果已经写入了待删除文件列表,大致如下

\??\C:\Users\feng\AppData\Local\Temp\Au_.exe

\??\C:\Users\feng\AppData\Local\Temp\~nsuA.tmp\Un_A.exe

\??\C:\Users\feng\AppData\Local\Temp\~nsuA.tmp

更具体的说,这个注册表项是由win32 api 函数 moveFileExW 函数 (winbase.h) 写入的,该函数调用时第三个参数指定了 MOVEFILE_DELAY_UNTIL_REBOOT 标志。https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-movefileexw

这样就会造成一个问题:有时卸载程序后提示某个文件要重启后删除,但又不想重启系统,并且,已经找到相关文件是哪个进程在占用并结束掉了,然后手工删掉了相关文件。

这时,如果还想重新安装该程序,安装向导很可能会提示,需要重启系统才能继续。但又不想重启系统。那么,该怎么办呢?

这时,只要到上述注册表项里,把相关行删掉,再运行安装程序,就可以继续了。其实最好是把所有行里的待删除文件都手工删除掉,再清空该注册表项。

(个人探索)卸载windows 10自带应用方法

windows10自带了很多应用,说实在的,实在烂得让人失去吐槽的兴趣,卸载是最好的对策。网上有一些卸载方案,比如google搜索出的这两篇

感觉这里的方案有点简单粗暴,不够优雅。突然发现了一个更好的办法,利用windows任务管理器,只卸载让你感到恶心的那些“应用”。

方法如下:

  1. 如果你发现某个恶心的“应用”被打开了(比如双击打开某个视频文件后,打开了“电影与电视”),先不要关闭它。
  2. 打开windows任务管理器,进入“进程”选项卡,在“应用”一组里,找到上述应用,点右键 - 属性
  3. “属性”对话框的“常规”选项卡里的“位置”一项,是一个路径,形式如 C:\Program Files\WindowsApps\***** 最后一级目录(即前面星号代替部分)就是应用的包名,将包名复制到剪贴板
  4. 以管理员身份启动Powershell(可以在开始菜单里找到 Windows Powershell,点右键 - 以管理员身份运行),运行 Remove-AppxPackage 包名
  5. 完成。

这样就只卸载你不需要的那些应用。

补记@2023/04/25

上文内容有点太老了,近几年已经有相当多更完善的方案,比如这篇  卸载重装 Windows 10 内置应用的最全方法,包含有卸载与恢复的方法,核心内容如下:

使用的 PowerShell 命令

Get-AppxPackage:用于获得 Win 10 系统内置应用信息。
Remove-AppxPackage:用于删除 Win 10 系统内置应用。
Add-AppxPackage:用于安装 Win 10 系统内置应用。

1 查询并记录安装下来有哪些应用,算是备份

Get-AppxPackage >> D:\win10_app_list_full.txt

或者精简的格式(只包含应用名与包的全名)

get-appxpackage | Select Name, PackageFullName >> D:\win10_app_list.names.txt

2 按包名卸载应用,与前述一样Remove-AppxPackage {包全名}

也可按包名关键词卸载 Get-AppxPackage *{包名关键词}* | Remove-AppxPackage

如 Get-AppxPackage *xboxapp* | Remove-AppxPackage 卸载xboxapp相关的

3 重新装回卸载的应用

从备份的应用名称文件中找到包名,查出其对应的InstallLocation,比如查计算器windowscalculator:运行 Get-AppxPackage -allusers *windowscalculator* ,结果输出里的 InstallLocation 一行是个长长的文件路径,放到下面命令里(即引号中的部分,太丑陋而简略了),运行即可安装回来

Add-AppxPackage -register "C:\ProgramFiles\....xml" -DisableDevelopmentMode

如果要一次性恢复所有应用,即恢复所有默认自带的应用,则可运行如下

Get-AppxPackage -AllUsers| Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}

运行中应该有报错,不用理会,完成后要重启windows生效。

windows远程桌面remote desctop连接到服务器的console控制台会话

If you need to connect to the console, start Remote Desktop from start run and use the console switch:

mstsc /console  /v 192.168.100.200:3389

详细的说明:运行 mstsc /? 得如下的用法说明

reffer: http://social.technet.microsoft.com/Forums/windowsserver/en-US/19a188a7-cafd-403a-b5e3-77e7c82dfbb2/can-vnc-server-run-on-windows-server-2008

一个无敌的下载站点:msdn I tell you,作什么用就不说了,谁用谁知道

http://msdn.itellyou.cn/?lang=zh-cn 传送门

windows系列操作系统,microsoft sql server服务器,ms office,share point,visual stuido....msdn里有的,这里都有,ed2k下载。

使用方法,选择你所需要的软件,点右侧“复制所先的项”,得到ed2k下载链接,然后你懂得。

只是可惜,ed2k下载有些资源/有时不稳定,有可能根本下载不动

现在有一个更好的办法:通过百度云网盘的离线下载功能

msdn.itellyou.cn里面都有什么东西,看图,不说话

msdn_itellyou_cap_1 msdn_itellyou_cap_2baidu-pan-down

百度网盘已经离线过N多文件,只要有人下载过,那么你再下载就只要0秒钟!你没看错,是0秒钟

使用cygwin在windows下自动备份目录数据/注册cygwin为windows服务

windows下备份目录是个蛋疼的事情,而linux的备份功能实在彪悍的让人感激涕零,然而对于出卖灵魂维护windows服务器的人士,在鄙视windows之余,还是得解决这个问题。突然想到cygwin这个强大的工具,是否可以在windows下使用它crond/crontab呢?查了一下,还真的有。

,先记来来,有时间研究一下

http://blog.csdn.net/cg_cheng/article/details/4377307  在cygwin下配置crontab

http://www.cnblogs.com/alaska1131/articles/1655643.html   windows下启动cygwin的cron/crontab

Windows使用维护优化相关(尤其windows 10的一些坑)

维护优化工具

Dism++  http://www.chuyu.me/zh-Hans/index.html

Windows 10共享文件(启用samba协议)

Windows 10连接其他机器上的共享文夹,无法连接。是因为至少是windows 10的某个版本起,默认不启用传统的samba 1.0 协议。可可以通过 控制面板——程序与功能——启用或关闭windows功能——smb1.0/cifs File Sharing Support,勾选确定,重启,可解。

Windows 10启用“休眠”功能(开始菜单的电源按增加“休眠”按钮)

windows 10休眠功能没有入口,最好像老版本一样,在关机时显示该按钮。如下:依次进入 控制面板-硬件和声音-电源选项-更改电源按钮的功能,有个“更改当前不可用设置”,前面带盾盾牌的符号,点它,“休眠”按钮前的勾选框可用,选之,保存修改。

4G内存启用PAE后 windows 2003 没有休眠功能

电脑加了条2G内存,现在4G了,使用的是windows2003操作系统(32位),所有4G内存甚至更大都可以完美支持,但发现没有休眠功能了,电源选项里休眠选项卡都没有了。原以为是某个服务,或什么出了故障,无法休眠,重启过就可以了;之前见过这个问题。但重启后还是不行。上网查原因,发现可以通过powercfg /a查休眠支持,运行后得到如下面内容

Microsoft Windows [版本 5.2.3790]
(C) 版权所有 1985-2003 Microsoft Corp.

C:\Documents and Settings\Administrator>powercfg /a
此系统上有以下休眠状态: Standby ( S3 )
此系统上没有以下休眠状态:
Standby (S1)
 系统固件不支持此待机状态。
Standby (S2)
 系统固件不支持此待机状态。
Hibernate
 系统正在以 PAE 模式运行,在 PAE 模式不允许休眠。

C:\Documents and Settings\Administrator>

系统正在以 PAE 模式运行,在 PAE 模式不允许休眠。

杯具了,看来只能每次关机了!

上面所说是查到这是这篇文章,google俄罗斯版的,问答系统,居然还是与天涯问答有关。

http://otvety.google.ru/otvety/thread?tid=2713a36a45a8eea9

dxsvcd@天涯社区 26.12.2009 17:19:50 Сообщить о нарушении

解决方案

使用命令行方式,通过以下的步骤来查看计算机支是否支持休眠功能。

1、单击“开始”,在“附件”中找到“命令提示符”,右键单击“命令提示符”

2、在命令提示符处,输入cmd,然后键入powercfg /a

如果计算机可以支持休眠功能,那怎样才能启用呢?

可以使用 PowerCfg 命令行工具来启用休眠功能。为此,可以按照下列步骤操作:

1、 单击“开始”,在“附件”中找到“命令提示符”,单击“命令提示符”;

2、在命令提示符处,键入 powercfg /hibernate on。 即可重新启用休眠功能了。

无MBR引导记录,以直接复制文件的方式变态的安装windows

背景:

普通笔记本电脑,新换了一只500G硬盘,安装操作系统时,基于把Linux/fedora作为首选OS的原因,规划分区如下

sda1  ext2  linux /boot  1G
sda2  扩展分区
sda5  ext3  linux /   30G
sda6  ntfs   windows安装分区C   36G
sda7  ext3  linux  /home 120G
sda8  swap  linux  swap 3.5G  [3G内存,为了使用休眠功能需要交换分区,至少应该等于物理内存大小]
sda9  ext3  linux  /data  140G
sda10  ntfs  win_D 30G
sda11  fat32  win_E
sda12 ntfs win_F
[注:无sda3与sda4的主分区]

linux在前些天早已经安装成功;有时候需要用windows,以前是用windows2003,有以前的windows2003的C盘ghost备份文件,直接还原到sda6,却无法启动。经过几天的探索学习,找到解决方法:

在Linux(fedora14 gnome)下,使用fedora自带的“硬盘实用工具”,把sda6重新格式化,格式化时选中“可启动”——这一非常重要,之前不能启动就是这个原因——然后启动windowsPE,使用Ghost镜像浏览器ghostxp,把所有文件提取到sda6,之后修改boot.ini,把其中启动项目修改为如下形式(注意其中粗体红字):

multi(0)disk(0)rdisk(0)partition(3)\WINDOWS="Windows Server 2003, Enterprise" /noexecute=optout /fastdetect

sda6在windows启动引导对硬盘分区的识别,sda6是partition(3) 。个人对windows启动分区计算方式不熟悉,可能就是windows计算机管理-磁盘管理 里面显示的分区从左到右依次排序,如果不确定,可以试一下其它数字。再次启动,在grub里执行

root (hd0,5)
chainloader +1
boot

进行引导windows。至此windows安装成功。(下面还有第二个windows操作系统的安装)

这一过程中其中几点注意事项及问题:

1. 因为对“window系统安装程序,不管三七二十一的要重写mbr的行为”感觉到非常不满,加上全新重新安装系统后还要安装驱动程序、常用程序太麻烦,所以起初不考虑使用安装盘安装而是使用ghost备份。启动时使用grub 引导windows启动分区。

2. 使用ghost还原,不能正常引导,于是考虑使用windows安装光盘全新安装,但在选择windows安装分区时,却得到提示说硬盘配置与windows不兼容,无法继续,可能就是因为sda1 (或是sda的mbr)是linux分区,windows不认所致。所以只能使用ghost备份入手了。

3. 格式化启动分区时,要格式化为“可引导”,这一点非常重要。起初发现直接ghost还原无法启动时,判断是因为sda6的启动分区中没有正常的启动扇区,于是使用安装光盘进入系统修复模式,以 fixboot 命令执行重建系统分区的引导扇区,但结果还是不能启动。

虽然windows2003在绝大多数跟xp是一致的,但有少数程序却无法在03下运行。也正是因为要一个游戏,它无法在windows2003运行,于是考虑还需要安装一个xp,之前没有做过xp的ghost镜像。因为无聊,加上无法使用全新安装光盘进行,所以准备使用网上的ghost版安装。网上的ghost都是没有完全安装完成的,还原后,还要进行几个步骤。

网上下载来的ghost镜像,都是要安装到C盘的,尝试安装到别的盘里,出错而无法继续进行,看来只能从C盘安装。于是想到了一个很巧妙的方法:在C盘下新建一个文件夹,并把C盘下的所有windows2003的文件转移到这个文件里,然后到windowsPE下,把xp的gho镜像里所有文件提取到C盘根目录里,修改boot.ini,跟上而安装03类似(这几个步骤当然不能在windows03下进行,我在PE里进行)。

然后重启动电脑,以grub启动sda6下的系统,就是ghost释放的分区,这步就是启动ghost安装的后面几步(自动进行,不受人工控制的)。这样正常安装xp到C盘下,安装完成后,进入xp,把ghost里带的没用的东西卸载掉,最好卸载所有程序。

再次启动到PE或linux里,把C盘下所有xp的文件复制到sda11里,并个性C盘下的boot.ini,加入

multi(0)disk(0)rdisk(0)partition(8)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /DETECTHAL

作为sda11的引导项目。

启动windows,进入sda11的xp,这时这个XP应该能正常工作,但它还是要依赖C盘下的不少文件,因为ghost系统的注册表里写入了大量对C盘文件的注册项,而不是使用当前系统所在的E盘里的文件。这里就需要修改注册表,把对C盘文件的注册项全部个性成对E盘的引用项,windows自带的注册表编辑器没有“替换”的功能,手工替换会累死人:替换了几个,感觉这样的项目太多了,因为看到有大量的SID项目,单这些项目就有至少几百条。于是网上查找注册表批量替换工具,还真的有,下载使用。查找 C:\,并全部替换成为 E:\

替换完成后,重启系统,发现C盘下的 Program Files ,windows等目录可以执行重命名操作了;而在之前,是无法对其进行改名的。这就证明 E盘下的xp已经不再使用C盘的文件了。

至此,两个windows都以相当变态的方法安装成功。整个过程前后花费了将近一个月时间,当然不是这一个月时间别的什么事情没干,就在搞这东西的,是一个月的闲暇时间。

以前还曾尝试过把虚拟机里的C盘备份出来,拷到实际硬盘上,尝试引导,不过引导过程中蓝屏死机,没有成功过,可能是驱动不配所致吧.

其实操作系统也都只是一系列文件,windows也是如此,相比linux,它的特点之一,就是注册表,大量配置信息都 在注册表里,只要修改得当,应该还是有很大的配置灵活性的。还有就是它的启动方式,跟linux不一样,它是要求使用一个可引导分区引导系统,严格说是启动导入系统ntldr(在vista/win7上是bootmgr),再由引导系统按照boot.ini加载相应分区下的windows的系统。

这里所述,其中有个人总结出来的,可能不全正确,还请高手多多指正。

http://www.path8.net/tn/archives/3995

http://www.path8.net/tn/archives/4065

以直接复制文件的方式,安装不依赖MBR的windows(grub启动)

500G硬盘,规划分区如下(图从略),

sda1  ext2  linux /boot

sda2  扩展分区

sda5  ext3  linux /

sda6  ntfs   windows安装分区

下略

使用linux格式化要安装windows的分区,格式化时要选中“可启动”的选项(这一点很重要),然后启动windows PE,启动ghostEXP,从ghost备份中“提取”出所有文件到所在分区,并把boot.ini里的分区设定修改一下,应该就可以正常启动进入windows了

windows里也有类似linux里grep的命令行工具:FINDSTR,只是实在太小儿科

突然发现,windows里也有类似linux里grep的命令行工具:FINDSTR,只是实在比较小儿科

今天看到这篇文章,才发现的

http://myeblog.3322.org/1086.html

看看微软给的官方文档:

在文件中寻找字符串。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]
[/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
strings [[drive:][path]filename[ ...]]

/B         在一行的开始配对模式。
/E         在一行的结尾配对模式。
/L         按字使用搜索字符串。
/R         将搜索字符串作为一般表达式使用。
/S         在当前目录和所有子目录中搜索匹配文件。
/I         指定搜索不分大小写。
/X         打印完全匹配的行。
/V         只打印不包含匹配的行。
/N         在匹配的每行前打印行数。
/M         如果文件含有匹配项,只打印其文件名。
/O         在每个匹配行前打印字符偏移量。
/P         忽略有不可打印字符的文件。
/OFF[LINE] 不跳过带有脱机属性集的文件。
/A:attr    指定有十六进位数字的颜色属性。请见 "color /?"
/F:file    从指定文件读文件列表 (/ 代表控制台)。
/C:string  使用指定字符串作为文字搜索字符串。
/G:file    从指定的文件获得搜索字符串。 (/ 代表控制台)。
/D:dir     查找以分号为分隔符的目录列表
strings    要查找的文字。
[drive:][path]filename
指定要查找的文件。

除非参数有 /C 前缀,请使用空格隔开搜索字符串。
例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或
"there"。'FINDSTR /C:"hello there" x.y' 文件 x.y  寻找
"hello there"。

一般表达式的快速参考:
.        通配符: 任何字符
*        重复: 以前字符或类别出现零或零以上次数
^        行位置: 行的开始
$        行位置: 行的终点
[class]  字符类别: 任何在字符集中的字符
[^class] 补字符类别: 任何不在字符集中的字符
[x-y]    范围: 在指定范围内的任何字符
\x       Escape: 元字符 x 的文字用法
\<xyz    字位置: 字的开始
xyz\>    字位置: 字的结束

有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。

功能比grep差多了,然而简单的截取功能也就差不多了,毕竟是微软的windows,不要指望它有多强的功能(命令行功能?)