Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell脚本-需要写入和附加文本文件_Powershell - Fatal编程技术网

Powershell脚本-需要写入和附加文本文件

Powershell脚本-需要写入和附加文本文件,powershell,Powershell,我绝不是powershell专家,所以我的问题对于大多数人来说可能非常简单… 目前,我每天都运行powershell脚本,将所有新的.RTF文件从一个目录移动到另一个目录,以获取我们所有客户的信息。 但是,并非总是有文件要移动,当发生这种情况时,我希望让脚本为第一个客户端创建一个文本文件。这种情况发生后,再为每个客户端追加该文件。 我试过几种方法,但都没能奏效 我当前为单个客户端编写的脚本是 $path = "\\XXXXX\XXXXXX\XXXXX\XXXXXX\XXXXXX\XXXXXX\*

我绝不是powershell专家,所以我的问题对于大多数人来说可能非常简单…
目前,我每天都运行powershell脚本,将所有新的.RTF文件从一个目录移动到另一个目录,以获取我们所有客户的信息。
但是,并非总是有文件要移动,当发生这种情况时,我希望让脚本为第一个客户端创建一个文本文件。这种情况发生后,再为每个客户端追加该文件。
我试过几种方法,但都没能奏效

我当前为单个客户端编写的脚本是

$path = "\\XXXXX\XXXXXX\XXXXX\XXXXXX\XXXXXX\XXXXXX\*.rtf" 
$Destination = "\\XXXXX\XXXXXX\XXXXX\XXXXXX\XXXXXX\XXXXXX" 
Foreach($file in (Get-ChildItem $path)) 
{   
If($file.LastWriteTime -gt (Get-Date).adddays(-1).date)     
{       Copy-Item -Path $file.fullname -Destination $Destination    } } 

然后我运行一个主脚本,启动这个脚本和其他连续的脚本

不要在
ForEach(…)
循环中的
if
语句中测试每个单独的文件,而是首先过滤掉这些文件:

$Path = \\...\*.rtf
$Destination = \\...\...
$LastWrite = (Get-Date).AddDays(-1).Date
$FilesToCopy = (Get-ChildItem $path | Where-Object {$_.LastWriteTime -gt $LastWrite})
现在,
$FilesToCopy
中有一个应该处理的文件数组;如果该数组为空(长度为零),则在没有要复制的文件时,可以执行任何需要执行的操作,否则可以复制文件:

if ($FilesToCopy.Length -eq 0) {
    # Create the text file
} else {
    ForEach ($File in $FilesToCopy) {
        Copy-Item -Path $File -Destination $Destination
    }
}

注意注释中的@LotPings是正确的;我上面代码中的
ForEach(…)
循环实际上可以被
$FilesToCopy | Copy Item-Destination$Destination
替换,但我强烈建议您在进行更改之前熟悉PowerShell管道的工作方式-它实际上与批处理(
cmd.exe
)的工作方式不同或者Unix/Linux(
sh/csh/bash/etc.
)管道也可以。

将您的命令计算出来,将其放入变量中,比如$x,然后将其输送到输出文件 像这样的,

$x | Out-File -Append temp2.txt
完整的代码应该加出来

$path = 'your Path' 
$Destination = "Your destination" 
$x ="No files to copy for client1" 
$LastWrite = (Get-Date).AddDays(-1).Date
 $FilesToCopy = (Get-ChildItem $path )| Where-Object {$_.LastWriteTime -gt $LastWrite} 

 if ($FilesToCopy.Length -eq 0) {
$x | Out-File -Append d:\creditdetails.txt 
  } 
  else { ForEach ($File in $FilesToCopy.FullName) {
   Copy-Item -LiteralPath $File -Destination $Destination 
   }
}

复制项接受来自管道的输入,因此Foreach是多余的:
$FilesToCopy |复制项-Destination$Destination
如果各种“客户机”之间的唯一变量是
$Path
$Destination
的值,那么将此脚本转换为高级函数可能值得一看(请参阅)在
ForEach
循环中调用高级函数。@LotPings-你确实是对的,我已经更新了答案来反映这一点,这要归功于你。不过,由于我在编辑中给出的原因,我不会更改基本代码。我是否需要为变量$File指定一个值,或者该值是否已自动设置?顺便问一下,请提供帮助!这就是我所拥有的,它没有移动文件或创建.txt文件-我肯定我搞错了…$path=“\\\\\\\…\…\…\…\…\…\…\…\…\audit pending\*.rtf”$Destination=“\\\\…\UploadedFiles\…\…\CreditDetails”$x=“没有为客户端复制的文件”$LastWrite=(获取日期)。AddDays(-1)。Date$FilesToCopy=(Get ChildItem$path | Where Object{$\ uu.LastWriteTime-gt$LastWrite}if($FilesToCopy.Length-eq 0){{{创建文本文件x$\ Out file-Append\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\你能简单地解释一下你想要实现什么吗?我有一组文件,每天从一个目录移动到另一个目录,供316个不同的客户端使用-在我当前的脚本中,移动工作正常,但如果没有文件要移动,我不会得到通知,这一点变得非常重要。为了让它移动文件或不移动,我如果我在一个txt文件中发现没有可移动的文件,我尝试使用此脚本使其发生。。。。