系统管理员每天都会在其 Windows 服务器上执行各种标准操作,包括创建、删除和移动文件及文件夹。通过熟练掌握本博客文章提供的核心一组 Active Directory (AD) PowerShell 命令,你可以大幅减少在 PowerShell 中创建文件所涉及的手动工作。
开始之前,请确保系统策略允许运行 PowerShell 脚本,正如“Windows PowerShell Scripting Tutorial for Beginners”中所述。 在下面的文章中,你将学习用于创建文件、删除文件、复制文件以及向文件追加内容的 PowerShell 命令。
使用 New-Item Cmdlet 进行基本文件创建
使用 PowerShell cmdlet New-Item 创建对象,例如目录、文件或注册表项。-Path 参数指定将创建新项的位置; -ItemType 参数指定要创建的项的类型。还可以使用其他参数,例如 -Name 和 -Value 来指定新项的名称及其内容。现在,我们来看看如何在 PowerShell 中创建文件。
分步指南:创建空白 文件和文件夹
创建文件夹
New-Item -Path “c:\NewFolderExample” -ItemType Directory
下面是使用 PowerShell 创建文件命令的示例:
创建文件
接下来,我们将介绍如何在 PowerShell 中创建文件,如下所示:
New-Item -Path ”c:\NewFolderExample\newfile.txt” -ItemType File
参数说明
让我们来看一下 New-Item cmdlet 的代码组件:
- -Path:此参数指定新文件将创建到哪里。在上面的示例中,文件创建在新建的文件夹中。你可以将此路径更改为任意你希望创建该文件的目录。
- -ItemType:此参数用于定义要创建的项目类型。在上面的示例中,我们指定了 Directory 和 File。
在 PowerShell 中,项目路径(item path)指的是项目(例如文件或目录)在文件系统或其他提供程序命名空间中的位置。在上面的示例中,我们使用了完全限定的项目路径(fully qualified item path),其中包含所有元素(提供程序、驱动器、容器、项目名称)。你也可以使用相对路径(relative paths)。在相对路径中,开头的反斜杠不表示驱动器的根目录。相反,它会被视为文件夹名称的一部分。实际位置取决于你在 PowerShell 中当前的工作目录。下面,我们将展示如何使用相对文件路径在 PowerShell 中创建文本文件:
New-Item -Path '\NewExampleFolder\newfile.txt' -ItemType File
示例
在不同目录中创建文件
你可以通过更改 -Path 参数,在 PowerShell 中在各种目录下创建文件。例如:
New-Item -Path "c:\projects\myfile.txt" -ItemType File
此 create file PowerShell 命令会在 D:\projects 目录中创建一个名为 myfile.txt 的空文件。
创建具有特定扩展名的文件
你可以使用 create file Windows PowerShell 命令来生成具有特定扩展名的文件。例如:
New-Item -Path "c:\NewFolderExample\mydocument.docx" -ItemType File
此命令会在 c:\NewFolderExample 目录中创建一个名为 mydocument.docx 的空文件。你可以根据要创建的文件类型指定任意扩展名,例如 .docx、.txt 或 .csv。
向文件添加内容
使用 Set Content
PowerShell 中的 Set Content cmdlet 用于编写或替换文件的内容。当需要用特定内容创建或覆盖文件中的文本时,该 cmdlet 非常有用。命令 Set-Content 非常适合向文件中写入简单文本,并且可以与自动化脚本一起使用,以生成包含预定义内容的配置文件或日志。它会直接替换文件内容,而不会追加。 powershell create file with content.
Set-Content -Path "c:\NewFolderExample\greetings.txt" -Value "Hello, World!"
使用 Out-File
您也可以使用 Out-File cmdlet 创建文件并写入数据,如下所示:
Get-Process -Name * | Out-File -FilePath c:\ NewFolderExample \processes.txt
另一种选择是将 cmdlet 的输出通过管道传递,例如 Get -ADuser 到 Export-Csv,这样会创建一个可以在 Excel 中打开的文件:
Get-ADuser -Filter * | Export-Csv -Path c:\dataADusers.csv
Out-File 通常用于捕获命令的输出(例如 Get-Process),并将其保存到文件中。出于日志记录和报表生成的目的,这非常有用。 Out-File 比 Set-Content cmdlet 更适合处理大量输出,因为它会将数据流式传输到文件,而不是先把数据加载到内存中。与 Set-Content 不同,Out-File 可以在使用 -Append 选项时追加到现有文件。
查看目录中的对象
要查看 Windows 文件服务器上目录的内容(包括所有文件和子目录),请使用 Get-ChildItem cmdlet。输出包含每个项目的名称、大小以及最后修改日期。它类似于 Windows 中的 dir 或 ls 命令。
Get-ChildItem -Path C:\NewFolderExample\
显示隐藏的对象
下面的命令会在 NewFolderExample 文件夹中显示所有根对象(包括隐藏对象):
Get-ChildItem -Path "c:\NewFolderExample -Force
显示所有子文件夹及其内容
以下命令使用 -Recurse 参数来扩展输出,使其包含所有子文件夹及其内容。每个子文件夹将分别显示。例如:
Get-ChildItem -Force \ NewFolderExample -Recurse
下面的示例展示了 NewFolderExample 内部第二个文件夹的内容。
筛选输出
你可以使用 -Filter、-Exclude、-Include 和 -Path 参数来筛选输出。
要进行高级对象筛选,请使用管道运算符 (|),将数据从 Get ChildItem cmdlet 传递到 Where-Object cmdlet。 例如,下面的脚本会搜索 fsShared 文件夹及其子文件夹中,在 2024 年 7 月 18 日之后修改过的所有可执行文件。
Get-ChildItem -Path C:\NewFolderExample -Recurse -Include *.csv | Where-Object -FilterScript {($_.LastWriteTime -gt '20
高级文件创建技术
创建多个文件
在 PowerShell 中高效地创建多个文件,可以使用循环来实现。该方法在创建名称相似的文件或创建到不同目录中的文件时尤其有用。
使用循环创建多个文件
下面是一个使用循环创建多个文件的示例:
1..5 | ForEach-Object {
New-Item -Path "C:\ C:\NewFolderExample\file$_.txt" -ItemType File
}
参数说明:
- 1..5:这会创建一个从 1 到 5 的数字范围。
- ForEach-Object:这个 cmdlet 会遍历该范围内的每个数字。
- New-Item:这个 cmdlet 会在循环的每次迭代中创建一个新文件。
- -Path “C:\temp\file$_.txt”:将创建每个文件的路径。$_ 表示迭代过程中当前的编号。
该脚本将创建五个文件,名称为 file1.txt、file2.txt、file3.txt 等,如下所示:
你可以使用循环来完成诸如在多个项目目录中创建模板文件、在各个应用程序目录中初始化日志文件,或将默认配置文件分发到多个用户目录等任务。
使用通配符
你可以在 PowerShell 中使用通配符,以同时对多个文件或目录执行操作。当与 New-Item cmdlet 配合使用时,通配符可以在单个命令中创建跨多个目录的文件:
New-Item -Path " C:\NewFolderExample\*\example.txt" -ItemType File
参数说明:
- 此命令会尝试在 C:\temp 的所有直接子目录中创建名为 example.txt 的文件。
- 路径中的 * 充当通配符,可匹配任意目录名称。
- PowerShell 将遍历 C:\temp 中的所有子目录,并在每个目录中创建 example.txt。
- 如果子目录中已经存在 example.txt,除非添加 -Force 参数,否则不会覆盖它。
删除文件和文件夹
到目前为止,我们一直专注于创建文件,但您也可以使用 PowerShell 来删除文件。使用 Remove-Item PowerShell cmdlet 删除文件、目录或其他对象。例如,下面的命令将删除指定的文件夹,以及所有子文件夹和文件。请注意,由于该文件夹并非空的,在执行前会提示您确认操作:
Remove-Item -Path '\NewFolderExample’
如果您已经确认文件夹内的每个对象都应该被删除,则可以使用 -Recurse 开关来跳过确认步骤:
Remove-Item -Path '\NewFolderExample' -Recurse
删除文件
下面的命令将从文件夹 NewFolderExample 中删除名为 newfile.txt 的文件:
Remove-Item -Path “C:\NewFolderExample\newfile.txt”
删除早于 x 天的文件
要清理目录中的旧文件,请使用类似这样的脚本:
Get-ChildItem -Path "C:\ NewFolderExample " -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-30))} | Remove-Item
删除空文件夹
以下脚本将识别空文件夹,并在不提示确认的情况下将其删除:
$Folder = "C:\ NewFolderExample "
#Delete empty folders and subfolders
Get-ChildItem $Folder -Recurse -Force -ea 0 |
? {$_.PsIsContainer -eq $True} |
? {$_.getfiles().count -eq 0} |
ForEach-Object {
$_ | del -Force -Recurse
$_.FullName | Out-File C:\deletedfolders.txt -Append
}
先检查文件是否存在,再删除
方法如下:检查名为 datalog.txt 的文件是否存在;如果存在,则将其删除:
$FileName = 'C:\datalog.txt'
If (Test-Path $FileName){
Remove-Item $FileName
}
使用 Netwrix Change Tracker 监控文件管理活动
覆盖写入与追加到文件
之前,我们讨论了使用 Set-Content cmdlet 来写入或替换文件。下面还有一些其他方法可以实现同样的效果。
使用 -Force 参数
下面是用于覆盖现有内容的另一个 PowerShell create file 命令参数:
New-Item -Path "C:\NewFolderExample\example.txt" -ItemType File -Force
PowerShell 中的 -Force 参数用于覆盖会阻止你进行更改的限制,例如只读属性,或同名项的存在。该命令会在 "example.txt" 的末尾添加“Additional line”。如果该文件不存在,它将创建该文件。
在运行命令之前,请注意下面的 example.txt 文件的大小:
现在请看:在 Windows PowerShell 中使用带有 -Force 参数的 create file cmdlet,会如何清除先前的内容。
参数说明:
- 如果“example.txt”已存在,此命令将直接覆盖该文件,而不会提示确认。
- 如果文件是只读的,-Force 将覆盖该属性并替换文件。
- 当你希望无论现有内容是什么,每次都创建一个全新的文件时,它对脚本非常有用
追加内容
你可以使用 Add-Content cmdlet:将数据追加到现有文件;如果文件不存在,则创建一个新文件。例如:
Add-Content -Path "C:\temp\example.txt" -Value "Additional line"
此命令会将“Additional line”添加到“example.txt”的末尾。如果文件不存在,它会创建该文件。
与 Set-Content 和 Out-File 的对比:
关键区别:
- Add-Content 用于追加, Set-Content 用于替换,以及 Out-File 用于灵活的输出重定向。
- Add-Content 保留并追加, Set-Content 替换,并且 Out-File 两者都可以。
创建特殊文件类型
CSV 文件
CSV(Comma-Separated Values,逗号分隔值)文件广泛用于存储表格数据。PowerShell Export-CSV cmdlet 允许你创建并操作 CSV 文件。它将对象转换为一系列以逗号分隔的值(CSV)字符串,并将其保存到 CSV 文件中,如下所示:
$data | Export-CSV -Path "C:\ NewFolderExample\data.csv" -NoTypeInformation
在下面的示例中,$data 是一个变量,其中包含你要导出的对象:
参数说明:
- -NoTypeInformation:从 CSV 文件中省略信息类型。通常这会生成更干净的 CSV 文件,并且不会包含 PowerShell 特有的类型数据。
- Export-CSV:该 cmdlet 将对象转换为 CSV 格式。
JSON 文件
JSON(JavaScript Object Notation)文件是以结构化、易于阅读的格式存储数据的文本文件。在 PowerShell 中,JSON 文件通常用于保存配置数据、应用程序设置或以键值对形式表示的其他数据。
ConvertTo-Json 和 Out-File 的组合允许你将 PowerShell 对象转换为 JSON 格式,并保存到文件中。
$data | ConvertTo-Json | Out-File -FilePath "C:\NewFolderExample\data.json"
在 PowerShell 中使用 JSON 文件的一些用途包括:从 PowerShell 脚本导出配置数据以供 Web 应用程序使用;为基于 PowerShell 的应用程序创建设置文件;或者准备要发送到 RESTful API 的数据,或存储 API 响应。
面向初学者的 Windows PowerShell 脚本教程
了解更多处理现有文件
在 PowerShell 中处理文件时,为了避免可能出现的错误,您可能需要在执行操作之前先确认文件是否存在。
检查文件是否存在
The Test-Path cmdlet 通常用于检查文件或目录是否存在。下面是如何检查名为 datalog.txt 的文件是否存在,并在存在时将其删除:
$FileName = 'C:\datalog.txt'
If (Test-Path $FileName){
Remove-Item $FileName
}
参数说明:
- Test-Path -Path “C:\temp\example.txt”:检查文件是否存在。
- -not:对结果取反,因此当文件不存在时该条件为真。
- 如果文件不存在,New-Item 会创建它。
在下面的示例中,只有当 ‘NewFolderExample’ 目录存在时,才会创建 newfile.txt
If (Test-Path -Path "C:\NewFolderExample") {
New-Item -Path "'C:\NewFolderExample \newfile.txt" -ItemType File
} else {
Write-Warning "Directory C:\ ''C:\NewFolderExample does not exist"
}
适用的用例是:仅在配置文件不存在时创建默认配置文件,从而避免覆盖现有的自定义配置。
复制和操作文件与文件夹
复制文件和文件夹
如果你想将诸如文件和目录之类的项从一个位置复制到另一个位置,请使用 Copy-Item PowerShell cmdlet。它类似于在 Windows 命令提示符中发出 copy 命令。
要在同一台计算机上的两个文件夹之间复制文件,请使用此命令:
Copy-Item -Path '\Shared\ITUsers.txt' -Destination '\Backup'
仅复制某些类型的文件
使用-Filter parameter,仅将源中的某些文件复制到目标位置。例如,以下命令仅将一个文件夹中的文本文件复制到另一个文件夹:
Copy-Item -Filter *.txt -Path \Shared\* -Recurse -Destination \Backup
重命名文件或文件夹
Rename-Item cmdlet 可让你更改对象的名称(例如文件或目录),同时保持其内容不变。它类似于 Windows 命令 ren。
-Path 参数指定文件或目录的位置,并且 –NewName 参数提供文件或文件夹的新名称。
例如,下面的 PowerShell create text file 命令会将文本文件重命名为带有下划线字符的相似名称:
Rename-Item -Path "\Shared\ITUsers.txt" -NewName "IT_Users.txt"
更改文件扩展名
Rename-Item 用于更改文件扩展名。
如果要一次更改多个文件的扩展名,请使用以下 PowerShell 更改文件扩展名命令,它会将所有 txt 文件扩展名更改为 bak。通配符字符(*)可确保包含所有文本文件。
Get-ChildItem \Shared\*.txt | Rename-Item -NewName { $_.name -Replace '.txt','.bak' }
常见问题排查
权限问题
在使用 PowerShell 时,权限不足是常见问题。典型的错误信息是 “The process does not have access rights to this object.” 解决此问题的方法如下:
- 进行系统级操作时,请以管理员身份运行 PowerShell。
- 修改 ACL(访问控制列表,Access Control Lists),以授予所需权限。
- 使用替代凭据
要以提升的权限运行 PowerShell:
- 在 PowerShell 图标上单击鼠标右键。
- 选择“以管理员身份运行”。
- 确认“用户帐户控制”提示。
输入错误
很容易拼错参数名称,但这样做会导致错误。输入较长的命令时,可以使用制表符自动补全,或查看 cmdlet 帮助(Get-Help cmdlet-name -Detailed)。
文件已存在
根据你要执行的操作,已存在的文件名可能会导致错误。避免这种情况的一种方法是使用条件命令,正如前面所讲。
If (-not(Test-Path -Path "C:\temp\example.txt")) {
New-Item -Path "C:\temp\example.txt" -ItemType File
}
真实世界的应用
脚本示例
你可以使用 PowerShell 创建日志文件。日志记录对于跟踪系统活动、错误以及应用程序行为至关重要。PowerShell 能够自动化日志文件的创建,从而更容易监控系统。下面的示例展示了一个函数,它允许你轻松地记录带时间戳的消息,而时间戳对于审计是必需的。随后,我们使用 Get-ChildItem cmdlet 来确认日志文件是否已创建。
你可以使用 PowerShell 编写脚本来自动化并简化各种任务。例如,你可以创建脚本来备份文件、检查服务器上的可用磁盘空间,或监控关键系统服务。
使用 Visual Studio Code
你可以使用 Visual Studio Code(VS Code)来增强 PowerShell 的能力。VS Code 是一款功能多样的代码编辑器,为 PowerShell 的脚本编写和开发提供了出色的环境。安装 VS Code 以及 PowerShell 扩展,即可使用诸如语法高亮、针对 cmdlet 和变量的 IntelliSense、代码片段以及集成调试等功能。编辑器提供可自定义的界面,并集成了终端,让你能够无缝编写、测试并运行 PowerShell 脚本。
安装 Visual Studio Code
- 从官方网站下载并安装 Visual Studio Code:Visual Studio Code。
- 安装完成后,打开 VS Code,并通过点击侧边栏上的方形图标或按 Ctrl+Shift+X 进入扩展(Extensions)视图。
- 在扩展(Extensions)视图中搜索“PowerShell”扩展,然后点击“Install”。该扩展提供丰富的 PowerShell 语言支持,包括语法高亮、IntelliSense、代码导航和调试。
结论
PowerShell 是用于文件和系统管理的强大工具。它提供了多种 cmdlet 和技术,用于创建、修改以及管理文件和目录。你可以使用 New-Item cmdlet 来创建必需的文件。随后,你可以使用更高级的脚本来创建多个文件、搜索现有文件,并对其进行移动或删除。你也可以使用 PowerShell 脚本来自动化琐碎的任务,为 IT 人员腾出时间。由于 PowerShell 目前被广泛使用,网上有大量资源可帮助你在学习和探索过程中获得指导。
常见问题
创建文件时如何修复 PowerShell 的权限被拒绝错误?
当执行策略阻止文件操作时,或当你对目标目录缺少写入权限时,就会出现 PowerShell 的权限被拒绝错误。首先,检查你的执行策略:
Get-ExecutionPolicy
如有需要,将其设置为 RemoteSigned 或 Unrestricted:
Set-ExecutionPolicy RemoteSigned
如果遇到目录权限问题,请以管理员身份运行 PowerShell,或在拥有写入权限的目录中创建文件,例如你的用户配置文件文件夹。在创建文件之前,使用 Test-Path 验证目录是否存在:
if (Test-Path "C:\MyFolder") {
New-Item -Path "C:\MyFolder\file.txt" -ItemType File
}
使用 try-catch 块实现适当的错误处理,以便在权限失败时能够从容应对。处理系统目录时,可以考虑使用替代位置或请求更高权限。在企业环境中,请确保你的脚本账户具有适当的权限,并在授予文件创建访问权限时遵循最小特权原则。请记住,权限问题往往反映了为保护系统完整性而设计的安全策略。
在 PowerShell 中创建文件有哪些不同的方法?
PowerShell 提供了多种文件创建方法,每种方法都针对不同的使用场景进行了优化:
# Create empty files
New-Item -Path "file.txt" -ItemType File
# Redirect command output to files
Get-Process | Out-File "processes.txt"
# Write data to files
Set-Content -Path "data.txt" -Value "Hello World"
# Append data to files
Add-Content -Path "log.txt" -Value "New entry"
# .NET method for performance-critical operations
[System.IO.File]::WriteAllText("C:\file.txt", "Content")
Export-CSV 会根据 PowerShell 对象创建结构化数据文件。每种方法都有特定的适用场景——New-Item 用于文件系统操作,Out-File 用于捕获命令输出,Set-Content 用于替换数据,Add-Content 用于日志记录场景。选择最符合你的具体文件创建需求和数据处理要求的方法。
如何在 PowerShell 中创建文件并进行适当的错误处理?
PowerShell 创建文件时正确的错误处理可以防止脚本失败,并在操作失败时提供有意义的反馈。将文件创建命令放入 try-catch 块中:
try {
New-Item -Path "C:\MyFolder\file.txt" -ItemType File -ErrorAction Stop
Write-Host "File created successfully"
} catch {
Write-Error "Failed to create file: $($_.Exception.Message)"
}
验证目录是否存在,并创建缺失的目录:
if (-not (Test-Path "C:\MyFolder")) {
New-Item -ItemType Directory -Path "C:\MyFolder" -Force
}
为诸如权限被拒绝、文件已存在或磁盘空间限制等常见问题实现特定的错误处理。加入日志记录机制,以便在审计目的下同时捕获成功操作和失败情况。对非终止性错误使用 Write-Error,对应当停止脚本执行的关键失败使用 throw。在尝试进行文件操作之前先验证输入参数,并提供清晰的错误消息,帮助用户理解发生了什么问题。对于生产环境脚本,可考虑为暂时性失败实现重试逻辑,并通过全面的日志记录满足合规与故障排查的需要。
如何使用安全权限创建 PowerShell 文件?
使用安全权限创建文件需要在文件创建过程中或创建后立即设置适当的访问控制。创建文件并应用安全设置:
# Create file
New-Item -Path "C:\secure-file.txt" -ItemType File
# Get current ACL
$acl = Get-Acl "C:\secure-file.txt"
# Modify permissions
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("Domain\User", "FullControl", "Allow")
$acl.SetAccessRule($accessRule)
# Apply ACL
Set-Acl -Path "C:\secure-file.txt" -AclObject $acl
对于敏感文件,应明确移除继承的权限,并仅向确实需要的特定用户或组授予访问权限。考虑使用 PowerShell 的安全 cmdlet 来实现 最小特权访问,确保只有授权人员可以读取文件。创建临时文件时,请将其放置在具有受限访问权限的安全位置,并实施清理流程以便在使用后删除。对于合规要求较高的环境,请在访问控制列表中包含审计设置,以跟踪对文件的访问尝试。请记住,文件安全始于了解谁需要访问哪些数据,并在保持可用性的同时实施能够强制执行这些要求的控制措施。
PowerShell 文件创建失败——常见原因和解决方案是什么?
PowerShell 文件创建失败通常源于权限问题、路径无效或执行策略限制。请检查目标目录是否存在,如有必要请创建:
if (-not (Test-Path "C:\TargetFolder")) {
New-Item -ItemType Directory -Path "C:\TargetFolder"
}
确认你对目标文件夹具有写入权限;如果要处理系统目录,请以管理员身份运行 PowerShell。确保文件路径不包含 Windows 在文件名中不支持的无效字符,例如管道符(|)、问号(?)或引号。检查可用磁盘空间,因为磁盘满会阻止文件创建。查看你的 PowerShell 执行策略:
Get-ExecutionPolicy
# Adjust if needed
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
对于网络路径,在尝试创建文件之前,先验证连接性和身份验证。使用针对性的错误处理来判断失败原因是权限、路径还是系统资源。排查问题时,先用简单的文件创建命令进行测试,然后逐步增加复杂度,以隔离并确定失败的具体原因。
分享到
了解更多
关于作者
Kevin Horvatin
首席软件架构师
Kevin Horvatin 是 Netwrix 的首席软件架构师,负责 Netwrix Privilege Secure。作为一名拥有 20 多年经验的软件开发人员,自 PowerShell 和 C# 推出以来,他一直与它们合作开发。