为每个文件夹及其子文件夹运行 powershell 脚本

Mie*_*ool 4 powershell

我有一些脚本需要针对十几个文件夹运行,所有文件夹都具有相对路径。我正在尝试使用一个主脚本来解决这个问题,该脚本针对该路径中的每个文件夹运行,一次一个文件夹。这些文件夹都是以下路径中“此处”文件夹的子级。我似乎无法正确理解语法,但我想我已经接近了:)

是否有一种更有效的方法来针对目录中每个文件夹的内容(一次一个文件夹)运行脚本?

$pdfFolder = 'C:\path\to\folders\here'
$Completed = Get-ChildItem $pdfFolder -Recurse

ForEach-Object ($Completed){
Invoke-Expression -Command "C:\path\where\scriptis\script.ps1"
}`
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 5

$pdfFolder = 'C:\path\to\folders\here'

# Get all subfolders - note the -Directory switch (PSv3+)
$Completed = Get-ChildItem $pdfFolder -Recurse -Directory

# Pipe the subfolders to ForEach-Object, invoke the
# script with & (avoid Invoke-Expression), and pass the subfolder
# at hand as an argument.
$Completed | ForEach-Object {
  & "C:\path\where\scriptis\script.ps1" $_
}
Run Code Online (Sandbox Code Playgroud)

至于你尝试过的

Get-ChildItem $pdfFolder -Recurse

该命令不仅返回文件夹(目录),还返回文件。要将输出限制为文件夹,请传递开关-Directory(PSv3+)。


ForEach-Object ($Completed) { ... }

foreach 您将循环的语法与基于管道的ForEach-Object cmdlet的语法混淆了。
该 cmdlet 需要来自pipeline 的输入,因此您必须
$Completed | ForEach-Object { ... }改为使用。

另请注意,除非您确实需要首先收集数组中的所有子文件夹,否则您可以简单地将调用Get-ChildItem直接传递到ForEach-Object.


Invoke-Expression -Command "C:\path\where\scriptis\script.ps1"

Invoke-Expression应该避免,因为它很少是正确的工具并且可能存在安全风险。

通过引用和/或存储在变量文件路径中调用脚本所需要做的就是使用&调用运算符,如上所示。