【问题标题】:Windows Power Shell rename filesWindows Powershell 重命名文件
【发布时间】:2018-11-21 20:06:44
【问题描述】:

我对脚本有点陌生,这是我的任务:

一个包含 X 个文件的文件夹。每个文件都包含一些 Word 文档、Excel 表格等。在这些文件中,有一个客户名称,我需要分配一个 ID 号。

此更改将影响此文件夹中包含此客户名称的所有文件。

如何使用 Windows Power Shell 做到这一点?

$configFiles = Get-ChildItem . *.config -rec
 foreach ($file in $configFiles)
{
(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace " JOHN ", "123" } |
Set-Content $file.PSPath
}   

这是正确的方法吗?

【问题讨论】:

  • 你将不得不以不同的方式做事。 [grin] PoSh 不能直接编辑 word 文档或 excel 电子表格。您可以安装一个 PoSh 模块来处理电子表格[我认为 ImportExcel 就是这样的一个名称]。编辑 MSWord 文档需要使用 COM 打开 MSWord 并对其进行控制。使用带有 powershell 的 COM 对象进行查找。 ///// 顺便说一句,PSPath 参数不是通常推荐用于您正在做的事情的参数。而是使用 .FullName 属性。
  • 您要重命名文件,还是要修改文件的内容?这是两个完全不同的操作。
  • Word 和 Excel 文档以专有的 XML 类型格式存储。你真的不能用powershell编辑这些文档的内容。看看 MS Office 互操作。 docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
  • @AnsgarWiechers 修改内容。示例:更改具有此人名的所有文件中的数字的人名
  • 如果你想修改文件的内容,方法取决于 Lee_Dailey 已经指出的文件类型。并非所有文件都是纯文本文件(特别是 MS Office 文件不是)。

标签: powershell scripting


【解决方案1】:

正如@lee_Daily 指出的那样,您需要使用不同的代码来执行不同文件类型的查找和替换。下面是一个示例,说明您可以如何做到这一点:

$objWord = New-Object -comobject Word.Application  
$objWord.Visible = $false

foreach ( $file in (Get-ChildItem . -r ) ) {
    Switch ( $file.Extension ) {
        ".config" {
            (Get-Content $file.FullName) |
                Foreach-Object { $_ -replace " JOHN ", "123" } |
                    Set-Content $file.FullName
        }
        {('.doc') -or ('.docx')} {
            ### Replace in word document using $file.fullname as the target
        }
        {'.xlsx'} {
            ### Replace in spreadsheet using $file.fullname as the target
        }
    }
}

对于执行查找和替换的实际代码,我建议两者都使用 com 对象。

单词查找和替换示例 https://codereview.stackexchange.com/questions/174455/powershell-script-to-find-and-replace-in-word-document-including-header-footer

excel查找和替换示例 Search & Replace in Excel without looping?

我也建议学习 ImportExcel 模块,它是我经常使用的一个很棒的工具。

【讨论】:

  • 你会在哪里包含文件夹路径?
  • (Get-ChildItem . -r ) .是当前文件夹,我只是使用了您的示例。只需将其更改为您想要的即可。
  • 我应该坚持使用 Windows power shell 还是尝试用 C# 语言实现?
【解决方案2】:

对于 Word 文档:这是我正在使用的。只是无法弄清楚这个脚本如何也可以更改 Word 文档中的页眉和页脚

$objWord = New-Object -comobject Word.Application  
$objWord.Visible = $false

$list = Get-ChildItem "C:\Users\*.*" -Include *.doc*  
foreach($item in $list){
$objDoc = $objWord.Documents.Open($item.FullName,$true)

$objSelection = $objWord.Selection 
$wdFindContinue = 1
$FindText = " BLAH " 
$MatchCase = $False 
$MatchWholeWord = $true
$MatchWildcards = $False 
$MatchSoundsLike = $False 
$MatchAllWordForms = $False 
$Forward = $True 
$Wrap = $wdFindContinue 
$Format = $False 
$wdReplaceNone = 0 
$ReplaceWith = "help " 
$wdFindContinue = 1 
$ReplaceAll = 2

$a = $objSelection.Find.Execute($FindText,$MatchCase,$MatchWholeWord, ` 
$MatchWildcards,$MatchSoundsLike,$MatchAllWordForms,$Forward,` 
$Wrap,$Format,$ReplaceWith,$ReplaceAll) 
$objDoc.Save()
$objDoc.Close()
}
$objWord.Quit()

【讨论】:

    【解决方案3】:

    如果我尝试在 C# 上运行会怎样?还缺什么吗?

     }
    string rootfolder = @"C:\Temp";
       string[] files = Directory.GetFiles(rootfolder, "*.*",SearchOption.AllDirectories);
       foreach (string file in files)
       {    try
         {    string contents = File.ReadAllText(file);
           contents = contents.Replace(@"Text to find", @"Replacement text");
           // Make files writable
       File.SetAttributes(file, FileAttributes.Normal);
    
       File.WriteAllText(file, contents);
     }
     catch (Exception ex)
     {    Console.WriteLine(ex.Message);
         }
       }
    

    【讨论】:

    • 切换到不同的编程语言并不能神奇地将二进制文件视为文本文件。
    • 我明白,但你认为最好的方法
    • PowerShell 在这方面做得很好,我相信 PowerShell 和 C# 使用相同的方法进行办公室集成。可能是错的,不懂 C#。
    • @OwainEsau 。我目前正在使用powershell,我能够找到并找出Word文档,但它不会更改文件的文件名和页眉和页脚
    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 2017-06-09
    • 2015-11-26
    • 1970-01-01
    • 2017-12-10
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多