Variables PowerShell查找文件并创建新文件

Variables PowerShell查找文件并创建新文件,variables,powershell,file-io,Variables,Powershell,File Io,我正在编写的脚本每次运行时都会生成一个日志文件。问题是,当脚本并行运行时,Out file将无法访问当前日志文件。这是正常的,因为上一个脚本仍在其中编写 因此,我希望脚本能够在启动时检测到已经有可用的日志文件,如果有,则创建一个新的日志文件名,并在括号中增加编号[] 检查一个文件是否已经存在是非常困难的,因为每次脚本启动时它都可能有另一个数字。如果它能在括号中找到这个数字,并用+1为新文件名递增,那就太好了 代码: $Server = "UNC" $Destination ="\\domain.

我正在编写的脚本每次运行时都会生成一个日志文件。问题是,当脚本并行运行时,
Out file
将无法访问当前日志文件。这是正常的,因为上一个脚本仍在其中编写

因此,我希望脚本能够在启动时检测到已经有可用的日志文件,如果有,则创建一个新的日志文件名,并在括号中增加编号
[]

检查一个文件是否已经存在是非常困难的,因为每次脚本启动时它都可能有另一个数字。如果它能在括号中找到这个数字,并用
+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
如中所述,您可以使用如下方式自动增加文件名中的数字:

while (Test-Path -LiteralPath $script:LogFile) {
  $script:LogFile = Increment-Index $script:LogFile
}
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)
}
其中,
Increment Index
实现将文件名中的索引增加1的程序逻辑,例如:

while (Test-Path -LiteralPath $script:LogFile) {
  $script:LogFile = Increment-Index $script:LogFile
}
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 (Test-Path -LiteralPath $script:LogFile) {
  $script:LogFile = Increment-Index $script:LogFile
}
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
是必需的,因为文件名包含方括号,否则将被视为。

请参阅的后半部分。感谢Ansgar提供的帮助。但我有点困惑。在我的示例中,我尝试创建一个初始日志文件,其中包含nr.
[0]
。当我将它与
Out File
一起使用时,它会失败,因为我似乎无法正确地避开括号。如果我成功地做到了这一点,那么如何只检查要添加的最新编号
+1
?因为当脚本关闭并运行下一个脚本时,示例中的变量
$filename
将丢失。
-LiteralPath
应注意方括号。请显示您得到的错误。至于丢失
$filename
:我的代码示例中的循环将自动为给定的名称模式
foo[#]bar.log
找到最小的未使用数字
。如果目标文件夹中已存在
foo[0]bar.log
foo[1]bar.log
,则循环将生成
foo[2]bar.log
作为下一个文件名。您的代码实际上在
$filename
中的固定值上工作。我现在试图找出如何检索驱动器上现有的文件名,并将其放入
$filename
变量中。当然,只适用于那些名字中有正确的
$Destination
Get Date
的人。我把事情复杂化了,它按设计工作。谢谢你,安斯加,这真的很有帮助。我会用你的答案更新我的问题。再次感谢你,伙计!令人惊叹的!第一个更容易阅读。其他人唯一缺少的是在
增量索引
之前添加单词
函数
。再次感谢你,伙计!:)@黑色1固定。谢谢你的提醒。