CRC Hashfiles per Batch erstellen.

German support forum

Moderators: white, Hacker, Stefan2

Post Reply
Koto99
Junior Member
Junior Member
Posts: 15
Joined: 2011-04-08, 15:49 UTC

CRC Hashfiles per Batch erstellen.

Post by *Koto99 »

Hallo
Habe mal eine Frage.

Ich will Hashfiles erstellen. Geht auch normal mit Total Commander einfach.

Ich will das aber per Batch machen. Dabei soll für jeden Ordner ein Hashfile erstellt werden.

Beispiel

Ordner
Mein Film 1
Mein Film 2
Mein Film 2

die entsprechenden Files dann
Mein Film 1.sfv
Mein Film 1.sfv
Mein Film 1.sfv

Normal muss ich immer jeden Ordner Manuell anwählen und das File Erstellen lassen.

Und ich will nicht dann die Ordner alle in ein File. Weil das sind mehr Ordner. Man will dann ja nicht gleich alle Checken.

Sollte das mit Total Commander nicht gehen nehme gern auch ein Externes Programm oder Batch Script.
User avatar
Dalai
Power Member
Power Member
Posts: 9386
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Im TC9 geht das ganz einfach: Haken setzen bei "Erzeuge separate Quersummendatei für jedes Verzeichnis".

Grüße
Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
Koto99
Junior Member
Junior Member
Posts: 15
Joined: 2011-04-08, 15:49 UTC

Post by *Koto99 »

Das geht Leider nicht so.

Ordner

Filme/Movie 1
Filme/Movie 2
Filme/Movie 3

Ergebniss soll sein
Filme/Movie 1.sfv
Filme/Movie 2.sfv
Filme/Movie 3.sfv

Das TC macht
Filme/Movie 1\Movie 1.sfv
Filme/Movie 2\Movie 2.sfv
Filme/Movie 3\Movie 3.sfv

Hoffe habe das richtig klar gemacht.

Wenn die sfv in einem Ordner nach Filmnamen sind. Kann die diese in Total Commander markieren und checken lassen. Und muss nicht immer extra in die Ordner zum Checken.

Dasselbe hätte ich ja dann mit der File Option machen können.

Und das Checken kann man nicht auf Verzeichnisse anwenden wo dann die sfv Files drin wären. Kopiere ich die sfv in ein Verzeichnis fehlt in den Dateien der Path,

Hier ist da auch Thema aber das Script funktioniert nicht.
http://ghisler.ch/board/viewtopic.php?t=41902&highlight=parameter+mandatory

Code: Select all

Calculating SHA1 checksum for 2 folders...
Get-ChildItem : Es wurde kein Parameter gefunden, der dem Parameternamen "File"
 entspricht.
Bei C:\CreateChecksum.ps1:56 Zeichen:75
+             $colFiles = Get-ChildItem -Path $pathFolderItem -Recurse -File <<
<<
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterB
   indingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Comm
   ands.GetChildItemCommand

Die Benennung "Get-FileHash" wurde nicht als Name eines Cmdlet, einer Funktion,
 einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie di
e Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und
 wiederholen Sie den Vorgang.
Bei C:\CreateChecksum.ps1:59 Zeichen:41
+                 $hashFile = Get-FileHash <<<<  -LiteralPath $file.FullName -A
lgorithm $algo
    + CategoryInfo          : ObjectNotFound: (Get-FileHash:String) [], Comman
   dNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Sie können keine Methode für einen Ausdruck mit dem Wert NULL aufrufen.
Bei C:\CreateChecksum.ps1:60 Zeichen:54
+                 $relativeName = $file.FullName.Remove <<<< (0, $folderItem.Fu
llName.Length)
    + CategoryInfo          : InvalidOperation: (Remove:String) [], RuntimeExc
   eption
    + FullyQualifiedErrorId : InvokeMethodOnNull

Out-File : Es wurde kein Parameter gefunden, der dem Parameternamen "LiteralPat
h" entspricht.
Bei C:\CreateChecksum.ps1:71 Zeichen:38
+                 Out-File -LiteralPath <<<<  $nameOutputFile -InputObject $fin
alString -Append
    + CategoryInfo          : InvalidArgument: (:) [Out-File], ParameterBindin
   gException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Comm
   ands.OutFileCommand

Ausnahme beim Festlegen von "LastWriteTime": "Der Prozess kann nicht auf die Da
tei "F:\Filme\A\A Beautiful Mind - Genie und Wahnsinn\" zugreifen, da sie von e
inem anderen Prozess verwendet wird."
Bei C:\CreateChecksum.ps1:76 Zeichen:31
+                 $outputFolder. <<<< LastWriteTime = $lastWriteTimeOutputFolde
r
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

Get-ChildItem : Es wurde kein Parameter gefunden, der dem Parameternamen "File"
 entspricht.
Bei C:\CreateChecksum.ps1:56 Zeichen:75
+             $colFiles = Get-ChildItem -Path $pathFolderItem -Recurse -File <<
<<
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterB
   indingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Comm
   ands.GetChildItemCommand

Die Benennung "Get-FileHash" wurde nicht als Name eines Cmdlet, einer Funktion,
 einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie di
e Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und
 wiederholen Sie den Vorgang.
Bei C:\CreateChecksum.ps1:59 Zeichen:41
+                 $hashFile = Get-FileHash <<<<  -LiteralPath $file.FullName -A
lgorithm $algo
    + CategoryInfo          : ObjectNotFound: (Get-FileHash:String) [], Comman
   dNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Sie können keine Methode für einen Ausdruck mit dem Wert NULL aufrufen.
Bei C:\CreateChecksum.ps1:60 Zeichen:54
+                 $relativeName = $file.FullName.Remove <<<< (0, $folderItem.Fu
llName.Length)
    + CategoryInfo          : InvalidOperation: (Remove:String) [], RuntimeExc
   eption
    + FullyQualifiedErrorId : InvokeMethodOnNull

Out-File : Es wurde kein Parameter gefunden, der dem Parameternamen "LiteralPat
h" entspricht.
Bei C:\CreateChecksum.ps1:71 Zeichen:38
+                 Out-File -LiteralPath <<<<  $nameOutputFile -InputObject $fin
alString -Append
    + CategoryInfo          : InvalidArgument: (:) [Out-File], ParameterBindin
   gException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Comm
   ands.OutFileCommand

Für "ToString" und die folgende Argumenteanzahl kann keine Überladung gefunden
werden: "1".
Bei C:\CreateChecksum.ps1:84 Zeichen:56
+ Write-Output ("`nDone. Duration: " + $timeSpan.ToString <<<< ("hh\:mm\:ss\,ff
f"))
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

PS F:\Filme\A>
Ach ja paar Infos.
Windows 7

Komando
powershell,exe

Parameter:

Code: Select all

-NoExit -ExecutionPolicy remotesigned -Command "&{&'C:\CreateChecksum.ps1' -sha1 -insidefolder -donttouch -listFile '%L'}"
C:\CreateChecksum.ps

Code: Select all

# TC Button Parameter:
# powershell.exe
# -NoExit -ExecutionPolicy remotesigned -Command "&{&'C:\PathTo\CreateChecksum.ps1' -sha1 -insidefolder -donttouch -listFile '%L'}"

Param(
    [Parameter(Mandatory=$True)]
    [ValidateNotNullOrEmpty()]
    [string]$listFile,
    [switch]$insidefolder,
    [switch]$sha1,
    [switch]$donttouch
)

if ($sha1)
{
    $algo = "SHA1"
    $extensionOutputFile = ".sha"
}
else
{
    $algo = "MD5"
    $extensionOutputFile = ".md5"
}

$contentListFile = Get-Content -Path $listFile

Write-Output ("Calculating $algo checksum for " + $contentListFile.Count.ToString() + " folders...")
$timeStart = Get-Date

foreach ($folder in $contentListFile)
{
    $folderItem = Get-Item -LiteralPath $folder
    $nameParentFolder = Split-Path -Path $folderItem -Parent
    $isFolder = Test-Path -LiteralPath $folderItem -PathType Container
   
    if ($isFolder)
    {
        if ($insidefolder)
        {
            $nameOutputFile = $folderItem.FullName + $folderItem.Name + $extensionOutputFile
            $outputFolder = Get-Item -LiteralPath $folderItem.FullName
            $lastWriteTimeOutputFolder = $outputFolder.LastWriteTime
        }
        else
        {
            $nameOutputFile = $nameParentFolder + '\' + $folderItem.Name + $extensionOutputFile
        }

        if (Test-Path -LiteralPath $nameOutputFile)
        {
            Write-Output ("`n" + $nameOutputFile + " already exists. Skipping")
        }
        else
        {
            $pathFolderItem = $folderItem.FullName.ToString().Replace('[','`[').Replace(']','`]')
            $colFiles = Get-ChildItem -Path $pathFolderItem -Recurse -File
            foreach ($file in $colFiles)
            {
                $hashFile = Get-FileHash -LiteralPath $file.FullName -Algorithm $algo
                $relativeName = $file.FullName.Remove(0, $folderItem.FullName.Length)
               
                if ($insidefolder)
                {
                    $finalString = $hashFile.Hash + ' *' + $relativeName
                }
                else
                {
                    $finalString = $hashFile.Hash + ' *' + $folderItem.Name + '\' + $relativeName
                }
               
                Out-File -LiteralPath $nameOutputFile -InputObject $finalString -Append
            }

            if ($donttouch -and $insidefolder)
            {
                $outputFolder.LastWriteTime = $lastWriteTimeOutputFolder
            }
        }
    }
}

$timeEnd = Get-Date
$timeSpan = New-TimeSpan -Start $timeStart -End $timeEnd
Write-Output ("`nDone. Duration: " + $timeSpan.ToString("hh\:mm\:ss\,fff")) 
Wobei ich sfv erstellen wollte.
User avatar
Stefan2
Power Member
Power Member
Posts: 4153
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

2Koto99

ich habe jetzt gerade zu wenig Zeit, aber die Meldung

Get-ChildItem : Es wurde kein Parameter gefunden, der dem Parameternamen "File" entspricht.
+ $colFiles = Get-ChildItem -Path $pathFolderItem -Recurse -File <<


bedeutet das du noch PowerShell v2 verwendest, siehe PowerShell Befehl "$Host"

Code: Select all

PS D:\temp> $host


Name             : ConsoleHost
Version          : 2.0
InstanceId       : df1423cb-994
(Dieser Weg ist nicht 100% der Richtige zur Versionsbestimmung, er soll uns aber hier reichen)


Dieser "-File" Parameter für "Get-ChildItem" wurde erst mit PowerShell v3 eingeführt.



Man müsste dieses Skript für PSv2 umschreiben (zumindest mal ein "#requires -version 3" einbauen :D )
oder auf PoSh v4 oder v5 updaten: Windows Management Framework https://www.microsoft.com/en-us/download/details.aspx?id=40855





 
User avatar
ZoSTeR
Power Member
Power Member
Posts: 1008
Joined: 2004-07-29, 11:00 UTC

Post by *ZoSTeR »

ZoSTeR wrote:If you're running Win7 you need to install PowerShell v4.
Aktuell ist PowerShell / WMF 5.1
Koto99
Junior Member
Junior Member
Posts: 15
Joined: 2011-04-08, 15:49 UTC

Post by *Koto99 »

Erst mal Danke nun geht das Script nach dem Update von Powershell

Nur ist das auch nicht das was ich möchte.

Das SHA wird nun wieder in den Ordner gepackt.

Das hatten wir ja schon und soll eben genau nicht so sein.

Ich will anwählen
Filme/Movie 1/
Filme/Movie 2/
Filme/Movie 3/

Ergebniss soll sein
Filme/Movie 1.sfv
Filme/Movie 2.sfv
Filme/Movie 3.sfv

Das Sript macht
Filme/Movie 1\Movie 1.sha
Filme/Movie 2\Movie 2.sha
Filme/Movie 3\Movie 3.sha

Damit habe ich wieder dasselbe was mit der File und Ordner Option geht.
Koto99
Junior Member
Junior Member
Posts: 15
Joined: 2011-04-08, 15:49 UTC

Post by *Koto99 »

Habe es nun hinbekommen.

-insidefolder muss weg dann klappt das. :-)

Was ist eigentlich der unterschied von sfv und SHA1

Es geht mit darum ob Sich Dateien verändert haben.
Danke für eure Hilfe :D
User avatar
ZoSTeR
Power Member
Power Member
Posts: 1008
Joined: 2004-07-29, 11:00 UTC

Post by *ZoSTeR »

SFV (Simple file verification) nutzt den CRC32 Algorithmus welcher nicht mehr zeitgemäß ist und von PowerShell nicht angeboten wird.
Post Reply