PowerShell查找文件并创建新文件

时间:2014-07-30 06:35:23

标签: variables powershell file-io

我正在处理的脚本每次运行时都会生成一个日志文件。问题是当脚本并行运行时,Out-File无法访问当前日志文件。这是正常的,因为之前的脚本仍在写入。

所以我希望脚本能够在启动时检测到已有可用的日志文件,如果是,则创建一个新的日志文件名,括号[<nr>]之间的数字增加。

检查文件是否已存在非常困难,因为每次脚本启动时它都可以有另一个数字。如果然后它可以在括号之间拾取该数字并使用+1为新文件名递增它将会很棒。

代码:

$Server = "UNC"
$Destination ="\\domain.net\share\target\folder 1\folder 22"
$LogFolder = "\\server\c$\my logfolder"

# Format log file name
$TempDate = (Get-Date).ToString("yyyy-MM-dd")
$TempFolderPath = $Destination -replace '\\','_'
$TempFolderPath = $TempFolderPath -replace ':',''
$TempFolderPath = $TempFolderPath -replace ' ',''
$script:LogFile = "$LogFolder\$(if($Server -ne "UNC"){"$Server - $TempFolderPath"}else{$TempFolderPath.TrimStart("__")})[0] - $TempDate.log"
$script:LogFile

# Create new log file name
$parts = $script:LogFile.Split('[]')
$script:NewLogFile = '{0}[{1}]{2}' -f $parts[0],(1 + $parts[1]),$parts[2]
$script:NewLogFile

# Desired result
# \\server\c$\my logfolder\domain.net_share_target_folder1_folder22[0] - 2014-07-30.log
# \\server\c$\my logfolder\domain.net_share_target_folder1_folder22[1] - 2014-07-30.log
#
# Usage
# "stuff" | Out-File -LiteralPath $script:LogFile -Append

1 个答案:

答案 0 :(得分:1)

my answer to your previous question中所述,您可以使用以下内容自动增加文件名中的数字:

while (Test-Path -LiteralPath $script:LogFile) {
  $script:LogFile = Increment-Index $script:LogFile
}

其中Increment-Index实现程序逻辑,该程序逻辑将文件名中的索引增加1,例如像这样:

function Increment-Index($f) {
  $parts = $f.Split('[]')
  '{0}[{1}]{2}' -f $parts[0],(1 + $parts[1]),$parts[2]
}

或者像这样:

function Increment-Index($f) {
  $callback = {
    $v = [int]$args[0].Groups[1].Value
    $args[0] -replace $v,++$v
  }

  ([Regex]'\[(\d+)\]').Replace($f, $callback)
}

while循环递增索引,直到它产生不存在的文件名。条件中的参数-LiteralPath是必需的,因为文件名包含方括号,否则将被视为wildcard characters