Tut mir leid, aber da blicke ich nicht durch. Sorry. Ebenso mit Zeile 15. Wo findet man denn Informationen darüber? Was machen denn das "?" und der ":" z. B.?
Edit: Übrigens, die Ausgabe des Scripts ist: $g_sShare = "False"
Tut mir leid, aber da blicke ich nicht durch. Sorry. Ebenso mit Zeile 15. Wo findet man denn Informationen darüber? Was machen denn das "?" und der ":" z. B.?
Edit: Übrigens, die Ausgabe des Scripts ist: $g_sShare = "False"
Tut mir leid, aber da blicke ich nicht durch. Sorry. Ebenso mit Zeile 15. Wo findet man denn Informationen darüber? Was machen denn das "?" und der ":" z. B.?
Das ist der ternäre Operator, ein "in-line-if-statement" wenn man so möchte.
Für das Skript mal aus:
Zeile 13 ist ein regulärer Ausdruck und nichts wildes. (.+?)\R?bedeutet einfach nur, matche alles bis ein Zeilenumbruch kommt (oder auch nicht) für jede Zeile.
MsgBox(0, 0, (($bMyVar = False) ? "My Var ist False" : "My Var ist True))
Die Anführungsstriche hinter "My Var ist True fehlen !
==> MsgBox(0, 0, (($bMyVar = False) ? "My Var ist False" : "My Var ist True"))
Edit : Professor Bernd
Local $bMyVar = True
; Variante 1 : ternärer Operator
MsgBox(0, 0, (($bMyVar = False) ? "V1 : My Var ist False" : "V1 : My Var ist True"))
; Variante 2 : man kann den ternären Operator auch so schreiben :
If Not $bMyVar Then
MsgBox(0, 0, "V2 : My Var ist False")
Else
MsgBox(0, 0, "V2 : My Var ist True")
EndIf
Alles anzeigen
Gruß Musashi
Das passiert wenn man im Forumeditor Quellcode frei nach Gedanken tippt ohne ihn vorher auszuführen. :rolleyes_:
Die Funktion im Gesamten ist klar, aber im Einzelnen würde ich gerne mehr wissen.
($bMyVar = False)
Die beiden Klammern machen aus dem Ganzen einen boolschen Ausdruck. Eigentlich müsste es aber eine Zuweisung sein ("="), da ich kein "If" sehen kann!?
danach folgt ? TextWennFalse : TextWennTrue
Die Logik ist mir klar. Was ich gerne wissen möchte ist, wo kommt das "?" her, und der ":" ? Mit welchem Suchbegriff kann man das in der AutoIt-Hilfe finden? (Mit "?" auf jeden Fall nicht.)
Bugtracker erfolgreich beendet! https://www.autoitscript.com/trac/autoit/ticket/3722
Die beiden Klammern machen aus dem Ganzen einen boolschen Ausdruck. Eigentlich müsste es aber eine Zuweisung sein ("="), da ich kein "If" sehen kann!?
Die Logik ist mir klar. Was ich gerne wissen möchte ist, wo kommt das "?" her, und der ":" ? Mit welchem Suchbegriff kann man das in der AutoIt-Hilfe finden? (Mit "?" auf jeden Fall nicht.)
Das hatte ich bereits im Post erwähnt, "ternärer Operator": https://www.autoitscript.com/autoit3/docs/keywords/Ternary.htm
Die Klammern machen daraus keinen boolschen Ausdruck, sie dienen lediglich dazu, den Ausdruck vorher zu evaluieren, damit nichts falsches geparst wird.
Einige Ausdrücke haben den selben Rang in der Operatorenpräferenz und deshalb ist es immer gut ternäre Ausdrücke als ganzes, und noch mal einzeln zu umschließen, damit das deutlich wird.
$b = True
MsgBox(0, 0, $b ? "Bla" : "Blubb" & "Ende")
$b = False
MsgBox(0, 0, $b ? "Bla" : "Blubb" & "Ende")
Die Zeichen ? : sind dafür gewählt, und sind auch in anderen Sprachen gleich.
Übrigens eine Zuweisung gibt es in AutoIt NUR als "Oberbefehl" in einer Zeile. $a = bla ist eine Zuweisung.
Du kannst nämlich auch boolche Ausdrücke in Variablen speichern, in etwa so:
Tut mir leid, aber da blicke ich nicht durch.
Ich habe das jetzt noch mal so gut ich kann aufgebröselt und mit Kommentaren versehen...beide Funktionen machen quasi dasselbe.
;-- TIME_STAMP 2019-06-25 23:15:03 v 1.0
#include <Array.au3>
Opt('MustDeclareVars', 1)
Global $g_sShare
$g_sShare = _Test1(@ComputerName)
ConsoleWrite('> _Test1: $g_sShare = "' & $g_sShare & '"' & @CRLF)
$g_sShare = _Test2(@ComputerName)
ConsoleWrite('- _Test2: $g_sShare = "' & $g_sShare & '"' & @CRLF)
Func _Test1($_sServername) ; Parameter beginnen immer mit "$_"
Local $iIndex, $aOutput, $iPID = Run('net view', '', @SW_HIDE, $STDOUT_CHILD)
ProcessWaitClose($iPID)
$aOutput = StringRegExp(StdoutRead($iPID), '(.+)\R?', 3) ; @CR|@LF|@CRLF als Trennzeichen verwenden.
; ( ... ) ; Capturing group. Das was in den Klammer ist, wollen wir haben.
; .+ ; . steht für ein beliebiges Zeichen, + für 1 oder mehr.
; \R? ; \R matcht "(?>\r\n|\n|\r)" eg. @CRLF|@LF|@CR, ? macht \R optional, es kann ein Trennzeichen vorhanden sein, muss es aber nicht - dann wird der komplette String genommen.
; , 3 ; $STR_REGEXPARRAYGLOBALMATCH (3) Return array of global matches.
$iIndex = _ArraySearch($aOutput, '\\' & $_sServername, 0, 0, 0, 1)
Return @error ? False : StringStripWS(_ArrayToString(_ArrayExtract($aOutput, $iIndex, $iIndex)), $STR_STRIPTRAILING)
EndFunc ;==>_Test1
Func _Test2($_sServername) ; Parameter beginnen immer mit "$_"
; NET VIEW zeigt eine Liste der Computer oder der von einem Computer freigegebenen Ressourcen an.
Local $sTrennzeichen, $iIndex, $sOutput, $aOutput[1], $iPID = Run('net view', '', @SW_HIDE, $STDOUT_CHILD)
ProcessWaitClose($iPID)
$sOutput = StdoutRead($iPID)
; Problematisch wird es mit StringSplit aber, wenn $sOutput gemischte Trennzeichen für die Zeilenumbrüche enthält, was mit StringRegExp aber kein Problem ist!
Switch True
Case StringInStr($sOutput, @CRLF)
$sTrennzeichen = @CRLF ; @CRLF als Trennzeichen verwenden
Case StringInStr($sOutput, @CR)
$sTrennzeichen = @CR ; @CR als Trennzeichen verwenden
Case StringInStr($sOutput, @LF)
$sTrennzeichen = @LF ; @LF als Trennzeichen verwenden
Case Else
$aOutput[0] = $sOutput ; $sOutput enthält nur eine Zeile
EndSwitch
If $sTrennzeichen Then $aOutput = StringSplit($sOutput, $sTrennzeichen, BitOR($STR_ENTIRESPLIT, $STR_NOCOUNT)) ; @CR|@LF|@CRLF als Trennzeichen verwenden
$iIndex = _ArraySearch($aOutput, '\\' & $_sServername, 0, 0, 0, 1) ; $_sServername im Array suchen
If @error Then Return False ; $_sServername nicht in gefunden!
Return StringStripWS(_ArrayToString(_ArrayExtract($aOutput, $iIndex, $iIndex)), $STR_STRIPTRAILING) ; Zeile aus dem Array extrahieren, als String konvertieren und alle Leerzeichen am Ende eliminieren.
EndFunc ;==>_Test2
Alles anzeigen
Edit: Übrigens, die Ausgabe des Scripts ist: $g_sShare = "False"
Dann ist bei dir evtl. SMBv1 deaktiviert... und die Ausgabe von net view liefert bei dir dann einen Fehler... so sollte sie in etwa aussehen:
Vielen lieben Dank für eure Ausführungen!
Das ist für mich "starker Tobak", für den ich etwas Zeit brauche zum Verdauen. Das kann etwas dauern, eher Wochen als Tage. Aber wenn ich dazu komme, gibts hier eine Rückmeldung.
Derzeit steht für mich ein wichtigeres Thema an. Dazu werde ich entsprechende Threads eröffnen.
Bis dahin nur kurz eine Antwort zum SMB 1.0, das ist bei mir aktiviert. Das weiß ich, weil ich es extra für meine FritzBox aktiviert habe.
Bis dahin nur kurz eine Antwort zum SMB 1.0, das ist bei mir aktiviert. Das weiß ich, weil ich es extra für meine FritzBox aktiviert habe.
SMB 1.0/CIFS automatisch entfernen
Hier würde ich dann aber den Haken rausnehmen, denn damit erlaubst du Windows, das Protokoll automatisch zu entfernen, wenn es 15 aufeinanderfolgende Tage nicht benutzt wurde.
Ob es aktiviert ist, kannst du z.B. so testen:
Erkennen: Get-WindowsOptionalFeature –Online –FeatureName SMB1Protocol
Deaktivieren: Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
Aktivieren: Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
Quelle: https://support.microsoft.com/de-de/help/269…-windows-server
Ich habe die Powershell mit Admin-Rechten gestartet und die Abfrage eingegeben. Es wird genau das angezeigt, was auch in deinem Screenshot zu sehen ist. Scheinbar ist SMB 1.0 enabled. Warum dein Script dann nur "... False" anzeigt, kann ich gerade nicht sagen. Ich habe das Script auch schon kompiliert und die Exe als Admin gestartet. Leider ohne Erfolg.
Dafür gibts hier einen Erfolg:
SMB 1.0/CIFS automatisch entfernen
Hier würde ich dann aber den Haken rausnehmen, denn damit erlaubst du Windows, das Protokoll automatisch zu entfernen, wenn es 15 aufeinanderfolgende Tage nicht benutzt wurde.
Vielen Dank für diesen Hinweis! Im Screenshot die Windows-"Hilfe", die, wie so oft, gar nicht hilft.
Warum dein Script dann nur "... False" anzeigt, kann ich gerade nicht sagen.
Was bekommst du denn für eine Ausgabe/Fehlermeldung, wenn du in der Eingabeaufforderung net view eingibst?
Dann kommt das hier.
Dabei fällt mir ein, dass ich vor nicht allzu langer Zeit irgendwas mit PowerShell probiert, aber nicht weiter gemacht habe, weil die PS medete, dass irgenwas nicht eingeschaltet sei. Leider kann ich mich nicht mehr erinnern, weder an die korrekte Meldung, noch wie sie ausgelöst wurde.
Kann es vielleicht sein, dass man die Funktionalität der Powershell erst irgendwo freischalten muss?
Dann kommt das hier.
Ok, das sieht gut aus... dann vermute ich mal, dass du keine einzige Freigabe (Datei/Ordner) auf deinem Rechner aktiviert hast und dein Rechner deshalb nicht in der Übersicht angezeigt wird.
Hier habe ich die Ordner mal rot markiert, die ich bei mir freigegeben habe... gib also mal einen Ordner oder eine Datei frei, dann sollte dein Rechner in der Übersicht angezeigt werden.
Kann es vielleicht sein, dass man die Funktionalität der Powershell erst irgendwo freischalten muss?
Nur wenn du Skripte ausführen willst...
https://www.computerweekly.com/de/tipp/Tipps-…rungsrichtlinie
Bevor du das geschrieben hast, habe ich mal die Execution Policies umgestellt, sogar kurzzeitig auf "Unrestricted". Das hat jedoch keine Änderung ergeben.
Das war alles für die Katz', denn dein Tipp mit der Freigabe war richtig! Hier benutze ich seit einiger Zeit einen FritzBox und darauf das NAS. Deshalb habe ich keine Freigaben mehr auf den einzelnen Computern. Ist viel praktischer.
Nachdem ich nun testweise einen Ordner freigegeben habe, wird der PC in deinem Script angezeigt. Ein Problem gelöst. Danke dafür!
Übrigens, warum wird der frei gegebene Ordner nicht mit einem Icon versehen? (Win 10)
Übrigens, warum wird der frei gegebene Ordner nicht mit einem Icon versehen? (Win 10)
Evtl. weil er leer ist?
Ich habe jetzt 1 Textdatei, 1 au3-Script und eine Exe-Datei hinein kopiert. Kein Icon. Ist nicht wichtig! Ich wollt's nur wissen. Danke!