<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>开发及运维技术 on SeleiXi</title>
    <link>http://blog.seleixi.site/categories/%E5%BC%80%E5%8F%91%E5%8F%8A%E8%BF%90%E7%BB%B4%E6%8A%80%E6%9C%AF/</link>
    <description>Recent content in 开发及运维技术 on SeleiXi</description>
    <image>
      <title>SeleiXi</title>
      <url>http://blog.seleixi.site/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>http://blog.seleixi.site/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo -- 0.134.2</generator>
    <language>zh-Hans</language>
    <lastBuildDate>Fri, 28 Feb 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="http://blog.seleixi.site/categories/%E5%BC%80%E5%8F%91%E5%8F%8A%E8%BF%90%E7%BB%B4%E6%8A%80%E6%9C%AF/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>对微服务的一些浅见</title>
      <link>http://blog.seleixi.site/zh-cn/post/microservice/</link>
      <pubDate>Fri, 28 Feb 2025 00:00:00 +0000</pubDate>
      <guid>http://blog.seleixi.site/zh-cn/post/microservice/</guid>
      <description>&lt;p&gt;最近刚好在接触不少后端架构设计方面的需求，对不少方案都进行了深入的了解。原本只是在后端八股文浅学的一些微服务理解，在现在看来也确实多了很多不同看法。&lt;/p&gt;
&lt;h3 id=&#34;解耦合&#34;&gt;解耦合&lt;/h3&gt;
&lt;p&gt;以前看八股文的时候，多是关注微服务对性能上的一些影响。但是当自己真正去为团队设计架构的时候，才会发现最需要考虑的其实是对项目的学习成本（或许是因为都只是为学校里的团队设计架构，而没有一个真实带领一个大厂的团队的经历吧）。新成员的基础通常都是无法直接上手开发的，让其去了解整个系统是怎么运作的难度颇高。但如果是微服务就可以减轻这方面的负担。
并且，对系统解耦合过后，不同团队的分工协作也可以更加明确。都说一个程序员其实 80%可能都是在开会，因为需要频繁与团队里负责其他关联模块的同学去进行沟通，但是微服务架构就在一定程度上减少了这种沟通成本。
当然，解耦合为不同的子系统也可以，这些子系统不需要互相通信，直接与前端对接。只是说通常来说，不同系统间会有一些互相通信的需求。&lt;/p&gt;
&lt;h3 id=&#34;问题追溯&#34;&gt;问题追溯&lt;/h3&gt;
&lt;p&gt;如果说是一个单体部署的架构的话，服务出现问题时，通常需要一定时间才能找出是哪一个部分出现了问题。但微服务间是互相依赖的，一旦有一个出现问题，Debug 的时候很容易通过其中的依赖关系去找到对应出错的模块，从而快速解决问题。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
    </item>
    <item>
      <title>为CloudFlare下的域名动态分配公网ip</title>
      <link>http://blog.seleixi.site/zh-cn/post/dynamic-domain/</link>
      <pubDate>Fri, 27 Dec 2024 00:00:00 +0000</pubDate>
      <guid>http://blog.seleixi.site/zh-cn/post/dynamic-domain/</guid>
      <description>&lt;p&gt;介于 CloudFlare 动态更新 DNS 会比较麻烦，所以很多 VPS 厂商都不会提供教学。网上有不少方案都是建议编写一个脚本来更新，但其实可以通过 ddclient 来进行修改，本文将会以 ubuntu 系统作为示例来展示如何用 ddclient 来实现 ddns。&lt;/p&gt;
&lt;p&gt;首先安装 ddclient&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get install ddclient
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接下来会出现一个 package configuration 的界面，依次选择 other - CloudFlare - 输入 CloudFlare 邮箱 - 输入 CloudFlare 的 API 密钥 - 选 Web-based IP discovery service, （如果是通过电脑直接用网线连 modem 来获得的公网 ip，也可以选择 network interface） - 输入你要动态分配 ip 的子域名&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudFlare 的 API 密钥的获得路径：CloudFlare 网站右上角头像按钮 - 我的个人资料 - 左边的 api 令牌 - API 密钥 - Global API Key&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意，此时的设置仍然是未完成的，你需要手动修改 /etc/ddclient.conf 来完成。
&lt;code&gt;vim /etc/ddclient.conf&lt;/code&gt; 后在你的&lt;code&gt;&amp;lt;子域名&amp;gt;.&amp;lt;域名&amp;gt;&lt;/code&gt;这一行的前一行增加 &lt;code&gt;zone = &amp;lt;你的域名&amp;gt;&lt;/code&gt; 注意这里是不包括子域名的，
最后的设置应该是这两种之一
&lt;img alt=&#34;setting1&#34; loading=&#34;lazy&#34; src=&#34;http://blog.seleixi.site/dynamic-domain-1.jpg&#34;&gt;
&lt;img alt=&#34;setting1&#34; loading=&#34;lazy&#34; src=&#34;http://blog.seleixi.site/dynamic-domain-2.jpg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>图床的三种实现</title>
      <link>http://blog.seleixi.site/zh-cn/post/image_hosting/</link>
      <pubDate>Sat, 21 Dec 2024 00:00:00 +0000</pubDate>
      <guid>http://blog.seleixi.site/zh-cn/post/image_hosting/</guid>
      <description>&lt;h3 id=&#34;第三方图床&#34;&gt;第三方图床&lt;/h3&gt;
&lt;p&gt;个人小网站通常会采取使用第三方图床（例如 lsky）的形式来进行图片托管&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开发 &amp;amp; 维护成本低&lt;/li&gt;
&lt;li&gt;可能的数据泄露（但对于非商业公司问题不大）&lt;/li&gt;
&lt;li&gt;需要支付一定费用&lt;/li&gt;
&lt;li&gt;存取速度不一定比得上储存在自己的服务器上的方案&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;以静态文件的形式寄存在服务器中&#34;&gt;以静态文件的形式寄存在服务器中&lt;/h3&gt;
&lt;p&gt;这是企业通常会采用的方案，直接存到服务器目录中，在需要图片的时候，通过访问服务器静态路径来获得。&lt;/p&gt;
&lt;h3 id=&#34;以本地数据库搭建图床&#34;&gt;以本地数据库搭建图床&lt;/h3&gt;
&lt;p&gt;这一种方式较为冷门，但对团队中运维同学的技术要求水平较低，并且迁移时会较为方便（数据库的移植比服务器中同时移植所有静态文件方便很多）&lt;/p&gt;
&lt;p&gt;具体实现方法会比上述两者在理论上更抽象一点，也需要实际把整个图床都写出来。&lt;/p&gt;
&lt;p&gt;定义 getImage 和 uploadImage 接口，在 uploadImage 接口上传想要储存的图片，将图片的数据读取后，以 BLOB 的形式存到数据库中。图片需要生成一个独立的 basename，而实现的方式可以参考 &lt;a href=&#34;https://github.com/lsky-org/lsky-pro/blob/master/app/Services/ImageService.php&#34;&gt;lsky 图床&lt;/a&gt; 是如何生成 basename 的&lt;/p&gt;
&lt;p&gt;而在 get 接口中，以一个 &lt;code&gt;localhost:8000/api/i/{imageId}.png&lt;/code&gt; 的形式定义接口，而非在 json body 中传入所需要获取的图片 id（这样的话，返回图片时浏览器可以直接把图片解析，并且显示在页面上），在接口中，以一个变量的形式来识别并接受这个 imageId，以 go 为例&lt;/p&gt;
&lt;p&gt;&lt;code&gt;router.Get(&amp;quot;/i/:imageId&amp;quot;, GetImage)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后就只需要根据这个 imageId 来在数据库中寻找对应图片，将图片的数据返回给前端，浏览器就会因为请求的文件以图片文件后缀为结尾，因此识别为一个图像文件，将其直接解析为图片在浏览器上显示（因此，这个 get 接口的链接，是可以直接拼接在一个 md 文件里面，或者让图片直接在一段文本中显示的）。&lt;/p&gt;
&lt;h3 id=&#34;对象存储-oss&#34;&gt;对象存储 OSS&lt;/h3&gt;
&lt;p&gt;常见方法之一，OSS 按存储量计费所以储存量高的话会很贵，但本身服务是大厂提供的（如阿里云 OSS）所以不会占用你的服务器带宽&lt;/p&gt;
&lt;p&gt;和数据库储存的比较：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务器带宽多的话，就选数据库储存（不需要计费）&lt;/li&gt;
&lt;li&gt;服务器带宽少且储存空间宽裕的话，就选数据库储存&lt;/li&gt;
&lt;li&gt;存取速度 OSS 快一点（当然，在万级是体现不出来的）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;</description>
    </item>
    <item>
      <title>网站防ddos/cc攻击的一些可行方案</title>
      <link>http://blog.seleixi.site/zh-cn/post/ddos/</link>
      <pubDate>Sun, 15 Dec 2024 00:00:00 +0000</pubDate>
      <guid>http://blog.seleixi.site/zh-cn/post/ddos/</guid>
      <description>&lt;h2 id=&#34;ddos&#34;&gt;DDOS&lt;/h2&gt;
&lt;h3 id=&#34;将域名挂载到-cloudflare-下并且确保不暴露服务器-ip&#34;&gt;将域名挂载到 CloudFlare 下，并且确保不暴露服务器 ip&lt;/h3&gt;
&lt;p&gt;将域名挂载到 CF 后，用户访问网站时服务器 ip 得以隐藏，因为访问时会经过 CF 的一系列解析，再由 CF 转发到服务器 ip，用户是不会知道域名对应的服务器 ip 的。所有的流量需要先经过 CF 再到达服务器，而 CF 本身即使是免费版也是有不弱的防 d 效果的（可以升级计划来获得更好的防 d 效果）。缺点在于套了一层 CF 后，国内用户访问该网站可能会变慢（CF 在国内没有节点），&lt;/p&gt;
&lt;p&gt;并且，可以加入一些效果更好的手段&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;源服务器直接拒绝掉除了 CF 以外的所有请求&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开启 CDN 以及挑战页（服务器拒绝所有 CDN 以外的请求）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;waf&#34;&gt;WAF&lt;/h3&gt;
&lt;p&gt;可以前置过滤非常多的异常流量，此外，可以在 CloudFlare 的 安全性 &amp;gt; WAF &amp;gt; 自定义规则 中进行手动设置&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果网站只供国内用户，ban 掉所有国外 ip，ddos 会有非常多来自国外的 ip 访问网站&lt;/li&gt;
&lt;li&gt;按 User-Agent(先分析日志)：限制异常 User-Agent（但有可能会误伤正常用户）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;高防服务器ovh--spartan&#34;&gt;高防服务器（ovh / spartan）&lt;/h3&gt;
&lt;p&gt;ovh 和 spartan 是比较主流的高防服务器大厂，缺点就是贵，但这两个厂家就是以高防服务器为出名。目前防 d 的服务器主流方案也是他们。在服务器 ip 暴露后，可以考虑这一方案。&lt;/p&gt;
&lt;h3 id=&#34;大厂做法&#34;&gt;大厂做法&lt;/h3&gt;
&lt;p&gt;用服务器集群来防，使用 anycast 把流量分配到最近的服务器上，以及负载均衡到压力小的服务器上。大厂有钱多服务器就可以这么干。&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何建立自己的自定义域名邮箱</title>
      <link>http://blog.seleixi.site/zh-cn/post/personal-domain-mail/</link>
      <pubDate>Fri, 22 Nov 2024 00:00:00 +0000</pubDate>
      <guid>http://blog.seleixi.site/zh-cn/post/personal-domain-mail/</guid>
      <description>&lt;p&gt;首先，你需要有&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自己的域名（需购买）&lt;/li&gt;
&lt;li&gt;一个 Cloudflare 账号&lt;/li&gt;
&lt;li&gt;一个邮箱（文章中将会以 Gmail 作为示例）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你的域名是在非 Cloudflare 的平台进行购买，可以域名注册商处对域名将 DNS 地址修改为 Cloudflare 指定的 DNS 地址（需要先在 Cloudflare 中添加域，选择 Free 计划即可），从而托管到 Cloudflare 上（不需要把域名转移到 Cloudflare）。&lt;/p&gt;
&lt;p&gt;转移过后，不需要修改其他的 DNS 记录，在左侧菜单中的&amp;quot;电子邮件&amp;quot; - &amp;ldquo;电子邮件路由&amp;rdquo; 进行设置。先在“目標地址”新增你的邮箱，然后在“路由规则”填入自定义的邮箱名前缀，选择&amp;quot;发送到电子邮件&amp;quot;，目标位置中填写想要中转到的邮箱（不限国内外邮箱），在确认了发去中转邮箱的验证码即可实现中转收信。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而如果想要在发信时用自己的自定义邮箱域名，你需要&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先在&lt;a href=&#34;https://myaccount.google.com/apppasswords&#34;&gt;https://myaccount.google.com/apppasswords&lt;/a&gt;中设置一个密码（应用名称可以随意填）&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;注意，这个feature只有在你开启了google二步验证才能使用&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;在&lt;a href=&#34;https://mail.google.com/mail/u/0/#settings/accounts&#34;&gt;https://mail.google.com/mail/u/0/#settings/accounts&lt;/a&gt;中的 &amp;ldquo;選擇寄件地址：&amp;rdquo; 中选择 &amp;ldquo;新增另一個電子郵件地址&amp;rdquo;&lt;/li&gt;
&lt;li&gt;输入昵称（发信时显示的名字）、在 Cloudflare 中自定义的域名邮箱（如seleixi@seleixi.com）&lt;/li&gt;
&lt;li&gt;依次输入 smtp.gmail.com、587（端口号）、账号是登入的 gmail(&lt;a href=&#34;mailto:xxx@gmail.com&#34;&gt;xxx@gmail.com&lt;/a&gt;)、密码是刚才在应用专属密码得到的密码（记得去掉空格）&lt;/li&gt;
&lt;li&gt;去邮箱确认验证信息即可。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果之后失效了，可能是创建的 google 应用专属密码没了，可以重新在 1. 中设置一下，然后到 2. 里面更新一下密码&lt;/p&gt;
&lt;p&gt;阿里云只能通过阿里邮箱来建立一个域名邮箱管理系统（好处是有独立的邮件服务器），亦或是建立其他国内邮箱服务的邮箱别名服务，而无法实现中转 Gmail 邮件。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bean / IOC容器概念</title>
      <link>http://blog.seleixi.site/zh-cn/post/bean-ioc-theory/</link>
      <pubDate>Mon, 26 Feb 2024 08:53:20 +0800</pubDate>
      <guid>http://blog.seleixi.site/zh-cn/post/bean-ioc-theory/</guid>
      <description>&lt;p&gt;在別的語言中，如果需要跨文件進行調用 Function，通常都要在不同文件中進行 Import，例如同一個目錄中有 2 個 python 文件，其中一個文件想要調用另外一個文件的一個 function，那麼就需要把另外一個 python 文件給 import 進來這個 python 文件，然後用[python 文件名].xxxFunction() 類似這樣的形式來實現對其他文件的函數調用。&lt;/p&gt;
&lt;p&gt;然而，這樣的情況就導致不同文件可能要經常對其他文件進行操作，而且過於重複，假如一個文件的某個函數要被其他 10 個文件調用，那麼這個 import 語句就需要寫 10 次。&lt;/p&gt;
&lt;p&gt;如果把這個函數，放進一個整個項目都通用的「池子」裡面，每個文件想調用他的時候，只需要在這個池子裡面取，而不需要去具體找出這個函數放在什麼位置、位置文件夾名字和文件名字叫什麼的話，會不會方便很多？&lt;/p&gt;
&lt;p&gt;而這個「池子」就是 IOC 容器，而需要放在 IOC 容器裡面的 Function，就是一種 Bean 對象。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;將一個 Function 放進 IOC 容器裡面，成為一個 Bean 對象可以用@Bean 註解。&lt;/li&gt;
&lt;li&gt;注意：@Bean 需要配合@Configuration 使用，以表示函數所在類為一個用於配置的類&lt;/li&gt;
&lt;li&gt;將一個 Class 放進 IOC 容器裡面，成為一個 Bean 對象可以用@Component 註解。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;想要從 IOC 容器中提取一個 Bean 對象，放到當前文件來使用，可以用@Autowired。&lt;/p&gt;
&lt;p&gt;e.g.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;這裡就是把一個 Bean 對象（名為 User 的一個 Class 類）以 user 這個 class 名，放進了這段程式當中。
這個操作就稱為「注入」了一個 User。&lt;/p&gt;</description>
    </item>
    <item>
      <title>用VBS实现工作自动化的基础知识</title>
      <link>http://blog.seleixi.site/zh-cn/post/website-starter/</link>
      <pubDate>Mon, 10 Oct 2022 00:00:00 +0000</pubDate>
      <guid>http://blog.seleixi.site/zh-cn/post/website-starter/</guid>
      <description>&lt;h2 id=&#34;自动打开浏览器的某个网页&#34;&gt;自动打开浏览器的某个网页&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Set ws=WScript.CreateObject(&amp;#34;WScript.Shell&amp;#34;)
ws.run &amp;#34;msedge.exe&amp;#34;
ws.AppActivate &amp;#34;新建标签页 - 用户配置 1 - MicroSoft Edge&amp;#34;
wscript.sleep 500
ws.SendKeys &amp;#34;www.baidu.com&amp;#34;
ws.SendKeys &amp;#34;{enter}&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;我们可以在执行完程序后，通过 ws.run &amp;ldquo;taskkill /f /im msedge.exe&amp;rdquo; 来把进程结束掉。
ws.run 可以理解为在 cmd 上执行指定命令&lt;/p&gt;
&lt;h2 id=&#34;克隆文件自身操作&#34;&gt;克隆文件自身操作&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Set fso=CreateObject(&amp;#34;Scripting.filesystemobject&amp;#34;)
currentpath = fso.GetFile(Wscript.ScriptFullName).Path
targetPATH = &amp;#34;C:\&amp;#34;
fso.CopyFile currentpath,targetpath,True &amp;#39;选择true即如果遇到同名文件，会覆盖文件
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;修改注册表示例&#34;&gt;修改注册表示例&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;set ws = createobject(&amp;#34;wscript.shell&amp;#34;)
ws.regwrite&amp;#34;HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools&amp;#34;,00000000,&amp;#34;REG_DWORD&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;执行后会把 cmd ban 掉&lt;/p&gt;
&lt;h2 id=&#34;修改文件&#34;&gt;修改文件&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;set FSO = CreateObject(&amp;#34;Scripting.FileSystemObject&amp;#34;)
FSO.createtextfile(&amp;#34;C:\123.txt&amp;#34;) &amp;#39;创建文件
FSO.Deletefile(&amp;#34;&amp;#34;) &amp;#39;删除文件
Movefile(&amp;#34;&amp;#34;) &amp;#39;重命名/移位
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;打开并读取文件&#34;&gt;打开并读取文件&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;set FSO = CreateObject(&amp;#34;Scripting.FileSystemObject&amp;#34;)
set x = FSO.opentextfile(&amp;#34;C:\1.txt&amp;#34;,mode，true) &amp;#39;mode为1就是只读、2就是覆写、8就是追加
x.close
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;获取当前路径&#34;&gt;获取当前路径&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SrcPATH = createobject(&amp;#34;Scripting.FileSystemObject&amp;#34;).GetFile(Wscript.ScriptFullName).parentfolder (此处若.parentfolder 改为.path 则是获取包括文件在内的 path)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;由此，我们可以通过上述程序的思路，使用 VBS 脚本实现很多其他自动化操作。但如注册表、任务管理器和 cmd 等等的权限管理在不同版本的操作系统上会出现极大的差异。如果遇到有可能会出现权限问题的地方，可以在文件开头加入 on error resume next 来跳过。&lt;/p&gt;</description>
    </item>
    <item>
      <title>用VBS修改Windows系统中程序开机自启动的三种方法</title>
      <link>http://blog.seleixi.site/zh-cn/post/3-ways-to-auto-start-app-on-boot/</link>
      <pubDate>Mon, 10 Oct 2022 00:00:00 +0000</pubDate>
      <guid>http://blog.seleixi.site/zh-cn/post/3-ways-to-auto-start-app-on-boot/</guid>
      <description>&lt;h2 id=&#34;直接修改注册表&#34;&gt;直接修改注册表&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#39;WScript.CreateObject(&amp;#34;WScript.Shell&amp;#34;).RegWrite &amp;#34;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\Startup&amp;#34;, Wscript.ScriptFullName, &amp;#34;REG_SZ&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在上述注册表路径中的 REG_SZ 字段中加入文件的路径+文件名+文件扩展。&lt;/p&gt;
&lt;h2 id=&#34;在系统指定的开机自启文件夹添加文件&#34;&gt;在系统指定的开机自启文件夹添加文件&lt;/h2&gt;
&lt;p&gt;通过在%AppData%\Microsoft\Windows\Start Menu\Programs\Startup 中添加文件，参考另外一个博客 &lt;em&gt;【用 VBS 实现工作自动化的基础知识】&lt;/em&gt; 中的文件自克隆操作。&lt;/p&gt;
&lt;h2 id=&#34;任务计划程序&#34;&gt;任务计划程序&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wscript.createobject(&amp;#34;wscript.shell&amp;#34;).run &amp;#34;schtasks /create /sc DAILY /tn &amp;#39;新计划任务&amp;#39; /tr &amp;#39;C:\xxx.exe&amp;#39;&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;语法:
schtasks /create /tn TaskName /tr TaskRun /sc schedule [/mo modifier] [/d day] [/m month[,month&amp;hellip;] [/i IdleTime] [/st StartTime] [/sd StartDate] [/ed EndDate] [/s computer [/u [domain]user /p password]] [/ru {[Domain]User | &amp;ldquo;System&amp;rdquo;} [/rp Password]] /?&lt;/p&gt;
&lt;p&gt;任务计划程序（Task Scheduler）这一方法在运行的时候经常会出现权限问题，在不同版本的操作系统执行也会有差异。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;值得注意的是，通过不同方法指定的开机自启动的速度亦会有差异，任务计划程序以及注册表中所指定的自启动文件通常是较快的。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
