Skip to content

zh

在 MacBook Pro 13,1 上安裝 Ubuntu 19.10

我對 macOS Catalina 感到挫折,因此決定將 Ubuntu 設為我 13 英寸的 MacBook Pro(不帶觸控條)的主要操作系統。作為一名軟件開發者,我發現 macOS 會與 Xcode 一同打包許多工具,這將佔用多達10GB的磁碟空間。雖然磁碟空間並非我主要的憂慮,但有時候網路下載的速度會很慢,而更新也可能會卡住。在試圖完成工作時流失一小時是不必要的障礙。

我起初擔心專有硬體是否能與開源的 Linux 分佈版兼容。令我驚訝的是,許多功能在初次安裝後就可以立即使用,感謝社區的努力。這包括了螢幕、鍵盤、觸控板,以及 Wi-Fi。唯一不適用的功能是音訊,但我可以使用我的 USB Type-C 耳機或帶有喇叭的 HDMI 外接顯示器來解決這個問題。這個 GitHub 頁面提供了關於各種 MacBook 硬體與 Linux 兼容性的詳細文檔:MacBook 在 Linux 上的硬體支援

如果你對在 MacBook Pro 上試用 Ubuntu 感興趣,請按照以下幾個簡單的步驟操作:

  1. Ubuntu 官方網站 下載 Ubuntu 19.10。
  2. 按照此指南的步驟,使用 Etcher 製作可開機的 USB 隨身碟:在 macOS 上製作 USB 隨身碟
  3. 重新啟動你的 MacBook,並按下 Option 鍵,選擇 USB 隨身碟作為開機設備。
  4. 嘗試使用 Ubuntu,如果你覺得合適,就繼續進行安裝。

就是這樣!作為開發者,你可以透過執行 sudo apt install git 來快速設定這類必要工具。這比在 macOS 上更簡單,macOS會以各種方式來限制你的自由。不應該對任何一個平台過於依賴,因為不能一直相信大公司會為了你的最佳利益行事,例如保護你的個人資料不受政府監視。擁抱開源社區,欣賞選擇替代操作系統的自由。

附註 1: 若要讓藍牙運作,請在這個儲存庫中執行找到的腳本:

MacBook 藍牙驅動

附註 2: 若要讓相機運作,請按照這份指南來安裝驅動:

相機驅動指南

設置 MongoDB 與 Koa.js

我正在建設一個 Koa.js 服務器,並需要將其連接到 MongoDB 以儲存和檢索數據。以下是如何在幾個簡單的步驟中實現這一點:

步驟1:初始化 Koa 應用程序之前連接到數據庫

const initDB = require("./database")

initDB()

const app = new Koa()

database.js 中,導入 mongoose。同時確保使用 npm install --save mongoose 進行安裝。Mongoose 是一個物件數據建模(ODM)庫。

const mongoose = require("mongoose")
import { connectionString } from "./conf/app-config"

const initDB = () => {
  mongoose.connect(connectionString)

  mongoose.connection.once("open", () => {
    console.log("Connected to the database")
  })

  mongoose.connection.on("error", console.error)
}

module.exports = initDB

接下來,為您的連接字符串創建配置:

export const connectionString =
  "mongodb+srv://" +
  secret.mongodb.username +
  ":" +
  secret.mongodb.password +
  "@xxxxxx.mongodb.net/test?retryWrites=true&w=majority"

您可以運行本地 MongoDB 實例,或者使用 MongoDB Atlas 並將其託管在 AWS 雲上。您會在那裡找到包含在配置文件中的連接字符串。

步驟2:在 Koa 中創建一個 Schema

例如,讓我們在 /models/users.js 中創建一個用戶模式。

const mongoose = require("mongoose")
const Schema = mongoose.Schema

const UserSchema = new Schema({
  username: String,
  email: String,
  picture: String,
})

module.exports = mongoose.model("User", UserSchema)

步驟3:創建一個服務來查詢數據

假設我們有一個 /service/user.service.js

import User from "../models/users"

export const getUserFromDb = async username => {
  const data = await User.findOne({ username })
  return data
}

export const createUserInDb = async user => {
  const newUser = new User(user)
  await newUser.save()
  return user
}

步驟4:在 Koa 控制器中調用服務

例如,假設我們有一個 /controller/user.controller.js

    import { getUserFromDb, createUserInDb } from '../service/user.service';

    static async getUser(ctx) {
      const user = await getUserFromDb(ctx.query.username);
      ctx.body = user;
    }

    static async registerUser(ctx) {
      const user = await createUserInDb(ctx.request.body);
      ctx.body = user;
    }

最後,您可以使用控制器註冊路由。現在,您應該能夠看到數據被存儲在數據庫中。如果您有任何問題,請隨時聯繫我。

將您的部落格從Medium遷移到Ghost 3.0

Ghost 3.0剛剛被發佈 (https://ghost.org/3/)。我對Ghost比WordPress有強烈的偏好,因為它使用Node.js而不是PHP。Ghost不僅是開源的,還提供了非常酷的黑色主題。所以,我決定將我的部落格從Medium遷移出去。然而,該過程並不直接,也有一些相關的成本。下面是一些步驟幫助你導航遷移並重新控制你的內容:

步驟一:從Medium導出帖子

在Medium上導航到設置並找到允許您下載您的數據的部分:

步驟二:導入至WordPress.com並導出文件

在WordPress.com上創建一個免費帳戶。在導入部分,您會找到一個可以從Medium導入內容的選項:

成功從Medium導入內容後,你可以從WordPress.com導出文件:

步驟三:通過插件將文件導入至WordPress.org並導出文件

http://wordpress.org/ 下載開源的WordPress軟件並使用MAMP (https://www.mamp.info/en/) 在本地運行。複製所有的WordPress文件並將它們放在MAMP內的/ htdocs資料夾中。啟動服務器,您應該能夠運行安裝了MySQL的本地WordPress實例。

導航至導入部分,並選擇從WordPress導入的選項:

然後,從https://wordpress.org/plugins/ghost/ 安裝官方的Ghost插件,並使用此插件導出你的部落格文章:

雖然有一個下載Ghost文件的選項,但對我來說並未奏效。嘗試點選下載.json檔案。

步驟四:導入至Ghost博客

轉到設置,然後轉到Ghost中的實驗室部分,並導入您的文件:

交叉手指!如果一切順利,您應該能看到所有您從Medium導出的文章現已遷移到Ghost 3.0。祝你寫博愉快 :)

在企業網路中設置npm代理

在企業網路下工作可能相當有挑戰性,因為許多東西不會即刻就能運作正常。像是 npm install 等簡易指令可能都無法正常運作。以下為如何跨過代理進行工作的方法:

假設你已經成功在你所使用的企業筆記本電腦中安裝 node.js,找出 .npmrc 檔案。在Windows系統中,該檔案通常位於 C:\Users\<your_user_id>\.npmrc,而在Mac機上,該檔案則位於 Users/<your_user_id>/.npmrc

打開該檔案並加入下列行數:

    https-proxy=http://yourcompanyproxy.com:80
    proxy=http://yourcompanyproxy.com:80
    strict-ssl=false
    registry=http://registry.npmjs.org/

再試執行 npm install,它應該現在可以運作了!

附帶一提的小提示:如果你在企業內部的 Nexus npm 倉庫有一些依賴關係,例如在 @npmcorp 範疇中,運行以下標令以指定正確的倉庫 URL:

    npm config set @npmcorp:registry https://your-company-nexus:80/nexus/content/repository/npm-internal

這樣做應該就能解決任何 "依賴性未找到" 的錯誤。試試看吧!

我的MBA德國學習之旅

旅行總是充滿了不確定性和偶然性。儘管我的航班在芬蘭赫爾辛基延誤,加上時差引起的壓力讓我在演講中感到壓力,但是此次旅程旅行最終還是讓我得到寶貴的經驗,讓我的專業管理技能得到了課堂以外的提升。

這次的旅程充滿了各種引人深思並且具有教育意義的講座,涵蓋了德國的宏觀經濟、歐洲聯盟、隱形冠軍、工業4.0、以及人工智能等各種主題。我們參觀了深度科技公司Wattx以及生產BMW汽車的Daimler AG工廠,開闊了視野。這次旅程中最重要的個人體會就是,德國具有反脆弱性。儘管德國在二戰期間脆弱不堪,但是它現在的財富狀況證明了它的反脆弱性。

這次旅程讓我明白,德國擁有最多的隱形冠軍公司——這些公司要么在全球排名前三,要么在歐洲排名第一,年收入超過500萬歐元,並且公眾認知度相對較低。許多中小企業專注於深度科技,德國經濟靠的是出口和創新。這些家族企業分布在德國各地,而不是只集中在柏林,在這1,307家隱形冠軍中。

從我的角度來看,由於其充滿活力的初創企業和分權化的特點,德國具有反脆弱性。大企業可能有強勢的等級結構和眾多的規定,但由於更高的人員流動率以及比較低的適應性和靈活性,它們更容易受到傷害。相比之下,中小企業擁有簡單的結構,這樣不僅能夠激發高效的工作文化,提高員工的參與度,還能更加以人為本。這種反脆弱性也體現在員工在公司內部各個職能間更加頻繁的轉換職位。中小企業的員工通常更能直接接觸客戶,這使他們能更好地理解客戶並更快地應對市場變化。

為了理解這些隱形冠軍如何保持競爭力,我們必須認識到它們在特定市場類別中的專業化。他們非常擅長在利基市場創造優質的產品,並且具有全球影響力。這些公司投入重金進行研發,他們持續創新的文化同時由客戶和最高管理層推動。所有這些元素共同為它們的反脆弱性做出了貢獻,使它們能夠在全球市場的不穩定和未知中生存並發展。

我注意到德國和香港的心態有明顯的區別。在香港,大多數學生都傾向於在金融和銀行業找工作,而德國提供更多的行業選擇,比如鋼鐵、鐵礦、機械、化學品、火車、汽車和電子產品等。德國不再將大學教育視為唯一的職業道路,而是為技術技能提供更多的職業培訓。這個多樣化的就業機會和對製造業和科技創新的重視使得這些國家更少受到風險的影響。

德國的經濟非常穩定,特點是低通脹、經濟穩步增長、貿易順差和強大的勞動力。有效的國家管理有助於避免經濟危機的重演,例如大蕭條和在二戰中導致納粹主義興起和政治不穩定的超通脹。理解歷史對於理解我們的起源、現在的挑戰以及在混亂局勢中改善風險管理至關重要。

我攻讀MBA的主要原因之一就是要在全球市場上提高自己的管理技能。我對不同國家之間的財富差異感到好奇。例如,我的學習之旅結束後,我去了瑞士,發現自己吃了迄今為止最貴的麥當勞大麥克套餐,花了12瑞士法郎(大約相當於93港元)。相比之下,在德國,同樣的餐點只需要7歐元,或者在香港約62元。如果你出生在經濟較弱的歐元區國家,例如羅馬尼亞的農村地區,那麼世界可能會讓你感到不公。這次旅程讓我看到了德國成功和反脆弱性的元素,無論是在我參觀柏林、漢堡、慕尼黑還是法蘭克福期間。

我學到的這些經驗將在我致力於在管理層創造反脆弱性工作環境的任務中起到重要的作用。在當今快速變化的數字環境中,建立一個能夠在不可預知性和不確定性中茁壯的公司比僅僅具有恢復力或堅韌性更為重要。如我在德國所觀察到的,規模較小、組織結構平坦的團隊能達到反脆弱性,而大型的層次結構則處於不穩定狀態。反脆弱性的組織擁抱實驗文化,並且避免"太大而不能倒"的心態。在這種環境下,管理者謹慎對待權力集中,領導者們對他們的團隊有信心,可以通過分權化的決策處理複雜的挑戰。

生活在人工智能和自動化的時代是令人充滿洋溢興奮。我們的行業正經歷著深刻的變革,面臨著擴大的未開發機會、越來越多的連接裝置以及更多的實際數據。在完成我的MBA學習後,我繼續努力以期在這個變化迅速的世界中獲得更大的反脆弱性,並且透過我在德國的國際經驗獲得獨特的視角。

案例研究:利豐家族企業

在這篇文章中,我們將討論從利豐家族企業中可以學習到的經驗。該公司存在已經超過一千年,其壽命之長的關鍵在於其為了生存而不斷地自我改造的能力。

不多的中國家族企業能夠成功地運營如此長的時間。利豐於1906年在廣州成立,是中國第一家貿易出口公司。今日,它已擴展到40個不同的國家,並雇用了超過20,000名員工。

家族企業的繼承帶來了重大挑戰。一句中國古語警告說,“富不過三代。”即使在美國,布魯克林學院的一項研究也顯示,70%的家族企業並未能從第一代過渡到第二代,88%則未能過渡到第三代。只有3%的家族企業能夠達到第四代。然而,利豐家族企業已經進入到了第四代。是什麼讓它脫穎而出?有哪些因素促成了它的成功?

答案在於創始人和繼承者之間的全球視野和開放思維。這種方法使家族企業能夠利用大規模經濟趨勢和變化。例如,當清朝末期中國開放貿易時,利豐將自己定位為第一個中國中間人,充分利用了他們對西方和中國市場的理解。通過與說英語的外國人的交往,他們擴大了他們比中國大陸其他商人更廣闊的視野。他們的適應能力使他們得以與香港作為製造業和服裝出口中心的崛起一同成長。他們同時也從中國的經濟改革中獲利,中國業務為他們的整體採購業務貢獻了超過51%。

然而,家族企業在第四代中面臨著挑戰,尤其是由於他們未能預見數字化趨勢。這一點在利豐拒絕了三次投資阿里巴巴的機會、堅持他們的傳統業務模式時尤其明顯。結果,他們在適應電子商務環境方面遇到了困難。這導致了利潤和收入的下降,因為全球品牌正在改變他們的供應鏈管理方式,往往繞過像利豐這樣的中間人。2017年,該公司被剔除出恒生成分股,這表明了它面臨的挑戰的規模。

儘管在其歷史上面臨過眾多挑戰,家族企業通過不斷自我重塑,並將這種精神傳遞給下一代,得以生存。例如,在朝鮮戰爭期間,美國對中國實行了禁運,影響了香港的再出口業務。然後家族從專注於再出口轉向出口香港本地商品。

等 第三代,受過哈佛商學院的教育,將新的現代管理理論帶入了傳統的家族企業中。這使得公司能夠上市,這要歸功於企業所有權與經營管理的劃分,以及良好治理實踐的建立。

利豐從“一個老闆/員工們”制度過渡到適當的管理階層制度,並更換由擁有大學學位的專業經理人員取代家族成員。儘管面臨了像1997年香港回歸中國這樣的歷史性挑戰,企業通過改變其與宏觀經濟趨勢相一致的策略進行了適應。

代表第四代的Spencer Fung也秉承了這些重要的家族價值觀。他在美國接受了MBA的教育,是個具有創業精神的人,並在矽谷共同創辦了個網路的行銷平台。儘管美國和中國之間的貿易戰爭,家族企業已經從中國轉向了越南和其他亞太國家。

下一個重要趨勢聚焦在速度、創新和數字化。第四代已經戰略性地投資於新技術,以減少供應鏈的交期並使3D虛擬設計快速成型。他們還使用進階的分析來改善各種業務指數。

總之,利豐家族企業成功地將西方在管理和科技的現代化與東方在關係和家庭價值觀方面的智慧相融合。他們不斷實施革命性的想法以推動變革和持續改進。他們在保持西式的系統管理方式的同時,加入了更多東方的,更具人情味的元素。雖然在美國,效率至上,但是利豐家族認識到了情商的重要性,對於企業的長期生存及其對於第四代面臨的挑戰的適應力至關重要。


MiFID II - 對於投資者來說,其影響及存在的機會是什麼?

MiFID II旨在為各種金融市場的投資者帶來更大的透明度和保護。對所有類型的投資者,從零售到專業的,都引入了增強的保護,並擴大了涵蓋的金融工具範圍。

歐洲以外的影響

直接受影響的市場包括法國、希臘、馬爾他和英國。儘管MiFID II是歐元區的法律,但其新規則具有遠大的全球影響。該法規適用於整個歐盟,並且對於不是歐盟一部分的歐洲經濟區(EEA)國家也有關。這意味著在EEA內進行金融工具投資活動或服務的任何公司都將受到新規則的約束。

該法規也間接影響了歐洲以外的地區,如亞太地區。MiFID II並不直接適用於非EEA公司,但主要在員工參與起源於EEA的MiFID II產品和服務,如債務和權益保險时,其規定才具有相關性。

MiFID II通常并无领土外效力,但有以下兩個情況需要注意:

  1. 如果一個非EEA實體在EEA內進行MiFID投資服務,對於MiFID產品而言,該法規將適用。
  2. 特定規定有明確的领土外影響,例如,交易報告要求適用於所有EEA實體的分支機構。

主要有四個影響領域:

  1. 研究  - 在MiFID II下,獲取免費研究被視為誘使行為,因此被禁止。
  2. 報告 - 現在的交易報告必須包括額外的交易細節,包括成本元素。所有定期報告必須至少每季度發行一次。如果有在一個自由投資組合,外匯操作,或跨期外匯交易中出現10%的資產減少,投資者將會收到通知。

  3. 最佳執行 - 現在,投資者將能夠看到他們們收到的執行質量和所使用的交易場所。

  4. 生產和發行 - 必須為投資者指定目標市場屬性。也必須分析產品的目標市場以防止對不適合的投資者進行銷售。

1. 解偶研究

MiFID II对投资组合经理和独立投资顾问引入了更多的限制。他们只能在以下两种情况下获得研究和销售服务:

  • 直接用他們自己的資金支付,或者
  • 通过一個客戶出資的研究支付賬戶 (RPA)。

這避免了可能的利益衝突。一些銀行分析師對這些改變感到擔憂,擔心失去工作,而在較小或獨立公司的分析師認為這是一個公平報酬的機會。

2. 報告

MiFID II會引入与持有和自由投资组合管理相關的季度报告。新的要求规定,持有杠杆金融工具(LFI)或其他或有负债交易(CLT)的公司必须在工具的初值贬低10%,然后是10%的倍数时,向投资者报告。

现在必须报告更广泛的财务交易。双方(投资公司)都必须向监管机构报告交易数据,这包括投资者的详细信息。

3. 最佳執行

最佳執行指的是公司有法规責任采取所有必要的步骤,以考虑價格、成本、速度及執行和結算的可能性等因素,為客戶獲得最佳可能的結果。

4. 生產和發行

在進行投資活动或提供投资服务时,需要对投资者进行分类。这个分类会影响公司的法规义务。

MiFID II還引入了對生產商和分銷商的要求,需要為他們創建或分銷的產品確定一個目標市場。這項分析還必須考慮任何負面的目標市場,即不應將產品銷給何種客戶。

如果您有進一步的問題,請在下方留言!

從網路檢索實時數據到Excel

一位本科生最近問我如何將網站上的實時數據導入Excel來完成作業。許多金融數據來源都需要收費,因此我提供了一個簡單的、免費的解決方案。現在,我也將這個解決方案分享給您。

首先,打開Microsoft Excel 365並轉到數據選項卡。找到從其他來源獲取數據的選項,然後選擇網絡

數據選項卡

接下來,輸入包含所需數據的URL

輸入網址

然後導航器將顯示各種可選表格。對於這個例子,我們選擇表格8。

選擇表格

當這個完成后,數據將導入您的Excel表格。但是,它需要手動刷新。要自動化這個過程,請右鍵點擊查詢,然後將屬性更改為每1分鐘刷新一次

自動刷新

這對於每分鐘更新一次很有用。但是如果你希望每秒鐘幾乎實時更新怎麼辦?在那種情況下,您需要編寫一些代碼。

導航到文件 -> 選項 -> 自定義功能區。在主選項卡下,啟用開發者選項卡

開發人員選項卡

然後,在開發者選項卡中,選擇Visual Basic

Visual Basic

選擇插入 -> 模塊,然後復制並粘貼下面的代碼片段:

Sub refresh_data()
    Sheets("Sheet2").Select
    Range("B2").Select
    Selection.Copy

    Sheets("Sheet1").Select
    Dim xCell As Range
    For Each xCell In ActiveSheet.Columns(1).Cells
        If Len(xCell.Value) = 0 Then
            xCell.Select
            Exit For
        End If
    Next
    ActiveSheet.Paste

    Sheets("Sheet2").Select
    ActiveWorkbook.RefreshAll
    Application.OnTime DateAdd("s", 1, Now), "refresh_data"
End Sub

粘貼代碼

點擊運行,然後就全部設定完成了!這段代碼可以翻譯為簡單的步驟:選擇Sheet 2,複制當前值,去到Sheet 1,找到第一列的最後一行並將值粘貼在那裡,然後回到Sheet 2並刷新所有數據。最後,該代碼將每秒觸發一次,使您能夠在Excel中實現幾乎實時的數據更新。

如果您有任何進一步的問題,隨時在下面留言。:)

在Ubuntu伺服器上使用Node.js和Nginx,為AWS EC2實例啟用HTTPS

我有一個在Ubuntu 16.04伺服器上運行Node.js和Nginx的AWS EC2實例。在這篇教程中,我將向你展示如何使用Let's Encrypt將你的網站從HTTP轉換為HTTPS。HTTPS防止未經授權的篡改你的網站與用戶瀏覽器之間的通信。它使用傳輸層安全性(TLS)認證對這種通信進行加密。Let’s Encrypt是一個提供免費X.509證書的證書頒發機構。

首先,SSH 連接到你的 EC2 實例:

ssh -i <keyfile.pem> ubuntu@<public-ip-address>

接著,將Let’s Encrypt的儲存庫複製到/opt/letsencrypt路徑:

sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

然後,透過運行以下指令來檢查是否有任何應用程式正在監聽80端口:

netstat -na | grep ':80.*LISTEN'

如果返回任何進程,終止它們。例如,如果你已經有一個Nginx伺服器在80端口運行,你可能需要如下停止它:

sudo systemctl stop nginx

之後,導航到你的儲存庫cd /opt/letsencrypt,並運行以下命令以獲得證書:

./letsencrypt-auto certonly --standalone --email <your@email.com> -d <domain.com> -d <subdomain.domain.com>

如果你遇到像這樣的錯誤:

OSError: Command /opt/eff.org/certbot/venv/bin/python2.7 - setuptools pkg_resources pip wheel failed with error code 1

然後在重新運行腳本之前設置以下環境變數:

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"

遵循屏幕上的指示,您應該在路徑/etc/letsencrypt/live/<domain.com>處獲得您的證書。

接下來,配置Nginx設置以將HTTP流量重新導向到HTTPS。使用以下命令編輯文件:

sudo vi /etc/nginx/sites-available/default

內容應該像這樣(記得替換<YourDomain.com> 和你的網站的根路徑):

server {
  listen 443 ssl;
  server_name <YourDomain.com>;
  ssl_certificate /etc/letsencrypt/live/<YourDomain.com>/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/<YourDomain.com>/privkey.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

  root /var/www/yourPath;
  index index.html index.htm;

  location / {
    proxy_pass http://localhost:3000/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto http;
    proxy_set_header X-Nginx-Proxy true;
    proxy_redirect off;
  }
}
server {
  listen 80;
  server_name <domain.com>;
  return 301 https://$host$request_uri;
}

為了測試你的配置是否有任何錯誤,運行:

sudo nginx -t

如果一切正常,重啟Nginx:

sudo service nginx stop
sudo service nginx start

最後但並非最不重要的,前往 AWS 控制台,確保你的安全群組已打開 443 端口,開放 HTTPS 連接。

AWS Console Screenshot

完成!導航至HTTPS版本的你的網域,驗證它是否正常工作。如果您遇到像502 Bad Gateway這種錯誤,確保你的Node.js應用程式正確運行。我使用PM2來保持它運行。讓我們使網路更安全!🙂

使用PowerShell替換XML文件中的文本

昨天,我在一個客戶現場工作,那裏有一個與外部網絡隔離的Windows伺服器。不允許在該機器上安裝任何第三方軟件。

PowerShell腳本

然而,我被交付了一項任務,要將所有XML文件名從“我的報告”換成“我的報告(新)”。原始文件,temp.xml,是這樣的:

    <ReportList>
      <Report Name="My Report">
      </Report>
    </ReportList>

預期的輸出文件,temp-new.xml,應有這樣的結構:

    <ReportList>
      <Report Name="My Report (New)">
      </Report>
    </ReportList>

沒有專門工具的訪問權限,並面對手動編輯數百個文件的前景,我轉向了PowerShell來編寫腳本。以下是完成此任務的幾行代碼:

步驟1:從我的測試文件夾中加載所有XML文件

    $files = Get-ChildItem C:\Users\victorleung\tw\Desktop\Test -Recurse -Include *.xml

步驟2:通過在原始名稱後添加"(新)"來修改所有報告名稱

    $xmldata = [xml](Get-Content $file);
    $name = $xmldata.ReportList.Report.GetAttribute("Name");
    $name = $name + " (New)";
    $xmldata.ReportList.Report.SetAttribute("Name", $name);
    $xmldata.Save($file)

步驟3:將文件名從temp.xml 改成 temp-new.xml

    Get-ChildItem *.xml | Rename-Item -NewName { $_.Name -Replace '.xml$','-new.xml' }

就是這樣!所有文件都已被更改。開心編碼!😃