Toon posts:

Powershell move bestanden maar geen folders

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heey,

Ik wil alle files moven van 1 folder naar een andere folder (archiveren, hij maakt een submap met de datum naam). Maar in die folder staan ook submappen, die hij op dit moment ook kopieert, en dan wil ik namelijk niet.Kan iemand mijn script aanvullen?

Er zitten 3 extensies in de folder op het moment die gemoved worden. (xls, txt, xml).

Mijn script ziet er nu zo uit:
$CurrentDateForDestinationFolder = Get-Date -uformat "%Y%m%d"
$FileSource = "C:\script"

$ArchiveDestination = "C:\script\archief\Archive_$CurrentDateForDestinationFolder"


if (!(Test-Path -path $ArchiveDestination))
{
New-Item -ItemType Directory -Path $ArchiveDestination
}

Get-ChildItem -Path $FileSource -force | Move-Item -Destination $ArchiveDestination
Alvast bedankt!

[ Voor 5% gewijzigd door Verwijderd op 01-03-2018 10:10 ]

Beste antwoord (via Verwijderd op 01-03-2018 12:16)


  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 09:08

ElCondor

Geluk is Onmisbaar

Ik snap hem, denk ik. Waarom voeg je de -force toe? Deze doet nu niets, want je gebruikt géén recursion. Dit wil je ook niet, dus kun je -force net zo goed weglaten.
En je mist een sluitende accolade bij de where statement. Op zich zou dit kunnen werken, alleen zijn er mooiere scripts voor te verzinnen, volgens mij.
PowerShell:
1
2
3
4
5
6
if (!(Test-Path -path $ArchiveDestination))
{
    New-Item -ItemType Directory -Path $ArchiveDestination
}

Get-ChildItem -Path $FileSource | Where-Object { ($_.Name -match ".txt") -or ($_.Name -match ".xml") -or ($_.Name -match ".xls") } | Move-Item -Destination $ArchiveDestination

Ik denk dat dit íets netter is. ;)

-edit-
wildcards zijn niet nodig in -match statements. :X

[ Voor 39% gewijzigd door ElCondor op 01-03-2018 11:42 ]

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)

Alle reacties


Acties:
  • 0 Henk 'm!

  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 27-09 22:07

MAX3400

XBL: OctagonQontrol

Je bent je -Recursive vergeten; die zou ik wel toevoegen anders werkt de -force niet (volgens de documentatie).

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 09:08

ElCondor

Geluk is Onmisbaar

Het is niet helemaal duidelijk wat je wilt. Wil je de subfolders an sich niet meenemen, maar wél de bestanden die er in staan?
Of wil je alléén de bestanden uit de root van de folder maar niet de subfolders en de bestanden die in de subfolders staan?
In het laatste geval is het een kwestie van recursion uit zetten.
In het eerste geval zul je een Where-Object toe moeten voegen die alléén kijkt naar bestanden
PowerShell:
1
!($_.PSIsContainer)
maar wel recursion gebruiken.
Weet je in dat geval wel zeker dat er geen dubbele bestandsnamen in de folders voorkomen? Want anders moet je daar ook nog op detecteren en dat afhandelen...

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey,

Ja sorry zal even verduidelijken. Dus in het mapje C:\Script worden elke dag 100den files gedumpt. Dus elke dag moet er onder C:\script een subfolder gemaakt worden genaamd Archivemetdedatumvanvandaag. Dus de subfolders onder C:script moeten niet meegenomen worden.

Dus na een tijd is het de bedoeling dat onder C:\script\ de volgende subfolders komen:
C:\script\archive_1/03/2018
C:\script\archive_2/03/2018
C:\script\archive_3/03/2018
C:\script\archive_4/03/2018

Is het dan zoiets?

code:
1
2
3
4
5
6
7
8
9
10
11
12
$CurrentDateForDestinationFolder = Get-Date -uformat "%Y%m%d"
$FileSource = "C:\script"

$ArchiveDestination = "C:\script\archief\Archive_$CurrentDateForDestinationFolder"


if (!(Test-Path -path $ArchiveDestination))
{
New-Item -ItemType Directory -Path $ArchiveDestination
}

Get-ChildItem -Path $FileSource -force | Where-Object { -and $_.Name -match "*.txt" -and $_.Name -match "*.xml" -and $_.Name -match "*.xls" | Move-Item -Destination $ArchiveDestination

?

Thanks!

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 09:08

ElCondor

Geluk is Onmisbaar

Ik snap hem, denk ik. Waarom voeg je de -force toe? Deze doet nu niets, want je gebruikt géén recursion. Dit wil je ook niet, dus kun je -force net zo goed weglaten.
En je mist een sluitende accolade bij de where statement. Op zich zou dit kunnen werken, alleen zijn er mooiere scripts voor te verzinnen, volgens mij.
PowerShell:
1
2
3
4
5
6
if (!(Test-Path -path $ArchiveDestination))
{
    New-Item -ItemType Directory -Path $ArchiveDestination
}

Get-ChildItem -Path $FileSource | Where-Object { ($_.Name -match ".txt") -or ($_.Name -match ".xml") -or ($_.Name -match ".xls") } | Move-Item -Destination $ArchiveDestination

Ik denk dat dit íets netter is. ;)

-edit-
wildcards zijn niet nodig in -match statements. :X

[ Voor 39% gewijzigd door ElCondor op 01-03-2018 11:42 ]

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • +1 Henk 'm!

Verwijderd

Topicstarter
Thanks bro! Dat werkt!

[ Voor 89% gewijzigd door Verwijderd op 01-03-2018 12:16 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Haa ik ben nog 1 ding vergeten. Ik zou telkens alleen de files moeten moven die de dag voorheen zijn aangemaakt(dus gisteren). Dus kan je ook met de where statement aangeven where Creationdate= systemdate -1day. ofzoiets is?

@ElCondor jij mss een idee?

Thanks!!!

[ Voor 9% gewijzigd door Verwijderd op 01-03-2018 14:09 ]


Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 09:08

ElCondor

Geluk is Onmisbaar

Ja, zoek en gij zult vinden. Google is your friend.

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Enig idee waarom onderstaande niet werkt?

code:
1
2
3
4
5
6
if (!(Test-Path -path $ArchiveDestination))
{
    New-Item -ItemType Directory -Path $ArchiveDestination
}

Get-ChildItem -Path $FileSource | Where-Object { ($_.Name -match ".txt") -or ($_.Name -match ".xml") -or ($_.Name -match ".xls") -and $_.LastWriteTime -lt (get-date).AddDays(-1) } | Move-Item -Destination $ArchiveDestination

Acties:
  • +2 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Verwijderd schreef op donderdag 1 maart 2018 @ 22:35:
Enig idee waarom onderstaande niet werkt?

code:
1
2
3
4
5
6
if (!(Test-Path -path $ArchiveDestination))
{
    New-Item -ItemType Directory -Path $ArchiveDestination
}

Get-ChildItem -Path $FileSource | Where-Object { ($_.Name -match ".txt") -or ($_.Name -match ".xml") -or ($_.Name -match ".xls") -and $_.LastWriteTime -lt (get-date).AddDays(-1) } | Move-Item -Destination $ArchiveDestination
Ik zou wat haakjes gaan plaatsen. Die where-object wordt van links naar rechts geëvalueerd. Zodra een statement matched stopt de evaluatie en wordt het move-item statement uitgevoerd.

Zo dus:
code:
1
Get-ChildItem -Path $FileSource | Where-Object { ( ($_.Name -match ".txt") -or ($_.Name -match ".xml") -or ($_.Name -match ".xls") ) -and ( $_.LastWriteTime -lt (get-date).AddDays(-1) ) } | Move-Item -Destination $ArchiveDestination


Waarom trouwens niet...
code:
1
Get-ChildItem -Path $FileSource -File | Where-Object { $_.LastWriteTime -lt (get-date).AddDays(-1) } | Move-Item -Destination $ArchiveDestination

De -File parameter zit er ook alweer sinds PS 3.0 in.

[ Voor 26% gewijzigd door downtime op 01-03-2018 23:20 ]


Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 09:08

ElCondor

Geluk is Onmisbaar

downtime schreef op donderdag 1 maart 2018 @ 23:13:
...
De -File parameter zit er ook alweer sinds PS 3.0 in.
Lekker!

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thanks man! Dat werkt ook! weer wat bijgeleerd.
Pagina: 1